2012-06-27 16 views
6

Tengo una aplicación que almacena nombre de usuario y contraseña en el llavero. Todo estaba funcionando bien cuando se trabaja en Xcode 3, recientemente se trasladó a Xcode 4 y ahora cuando ejecute la aplicación, me sale un aviso:La aplicación siempre solicita permiso para acceder al llavero

Application wants to use your confidential information stored in keychain" in your keychain.

Después de golpear siempre permiten que veo la aplicación añade al control de acceso lista del elemento llavero, pero me sale cada vez que ejecuto la aplicación.

También después de presionar Permitir nuevamente, veo que el control de acceso tiene dos instancias de la misma aplicación. Parece que OS cree que esta es una nueva aplicación.

Cualquier idea apreciada.

+0

¿Cómo está firmando el código de su aplicación? (Esa es una de las razones más comunes de este problema.) – abarnert

+0

Tengo que configurar el signo de código en la configuración de compilación de Xcode. Debajo del código, he seleccionado una identidad de firma de código para mi aplicación de ID de desarrollador –

+0

¿Ha ejecutado una compilación anterior en el misma máquina?Dependiendo del Requisito Designado (que depende de la versión de Xcode 4 que use, si solo se queda con los valores predeterminados), el Llavero puede tratar su compilación anterior y la nueva como diferentes aplicaciones, lo que significa que aparecerá su nueva compilación advertencias si la construcción anterior había almacenado algo en el llavero. – abarnert

Respuesta

3

Creo que el problema es que el requisito designado de su firma hace que no se acepte a sí misma como "la misma aplicación" que a sí misma (para propósitos de Llavero).

Una causa común para esto, y creo que es suya, es utilizar un certificado de aplicación ID de desarrollador, sin requisitos designados, y sin el certificado intermedio instalado.

Un requisito desarrollador ID estándar se parece a esto:

designated => anchor apple generic and 
identifier \"com.example.appName\" and 
((cert leaf[field.1.2.840.113635.100.6.1.9] exists) or 
(certificate 1[field.1.2.840.113635.100.6.2.6] exists and 
certificate leaf[field.1.2.840.113635.100.6.1.13] exists and 
certificate leaf[subject.OU] = \"1AZBYCXDW9V\")) 

Si desea construir usted mismo, usted tiene que reemplazar el identificador con su identificador de paquete y la subject.OU con el valor de su certificado. (Si se hace doble clic en Acceso a Llaves, que debe aparecer como la unidad organizativa.) A continuación, puede añadir a "Otras banderas firma de código":

--requirements "=designated ..." (the whole mess from above) 

Sin embargo, una mejor manera de hacer esto es usar Xcode 4.3.2 o posterior. Si reconoce que está utilizando un certificado de aplicación ID de desarrollador, y puede ver el certificado intermedio en el llavero, lo generará de manera predeterminada.

Además, si usa el Archive Organizer en Xcode para "Exportar la aplicación firmada por ID del desarrollador", en lugar de simplemente usar la compilación desde su directorio de destino, se asegurará de firmar su aplicación y cualquier otra señalización incluida, y probará que todo esté configurado correctamente. (Las fallas son bastante crípticas; por ejemplo, su paso "Elija una ID de desarrollador para iniciar sesión" puede no tener opciones, con un mensaje en el syslog que no tiene información útil) pero al menos el hecho de que falló o tuvo éxito se reduce dónde está su problema.)

De cualquier forma, debe descargar e instalar (en su máquina de compilación) el certificado intermedio, denominado "Autoridad de certificación de desarrollador ID", del enlace "Certificado ID de desarrollador" en el sitio Developer Certificate Utility .

Una última cosa: incluso si esto resuelve el problema que se está ejecutando en su máquina de compilación, realmente desea probar en la versión de sistema operativo más antigua que admita. Por ejemplo, los requisitos compilados por Lion's codesign a veces no se pueden analizar en Leopard, o incluso en Snow Leopard. Si eso sucede ... ver Gatekeeper vs. Leopard: an ongoing tale.

+0

Gracias abarnert, fue mucha información excelente. Pero parece que encontré una resolución a este problema. Eliminé la firma de código de la interfaz de usuario en Xcode y agregué esto como un paso de línea de comando al final de mi script de compilación. Esto parece estar funcionando bien ahora, pero realmente, muchas gracias por toda la ayuda. –

+1

Nitin, puedes compartir tu resolución, estoy teniendo el mismo problema con Xcode 6 –

Cuestiones relacionadas