2010-11-06 15 views
54

Estoy describiendo un problema por el cual me llevó bastante tiempo aprender la respuesta.Cómo compartir datos de llavero entre aplicaciones de iOS

El ejemplo "GenericKeychain" es un buen comienzo para proporcionar un contenedor para compartir datos de llavero entre las aplicaciones cuando se utiliza accessGroup en el init.

Sin embargo, la implementación de esto en mi aplicación arrojó un oscuro código de error (que llevó una eternidad localizar) -25243, lo que significa: Sin control de acceso.

Ejecuto la aplicación de ejemplo de Apple (GenericKeychain) en mi iPad solo para obtener el mismo error. ¿Huh?

¿La documentación de Apple no cumple con lo necesario para lograr esto?

+0

@GtotheB, nice answer! Si lo desea, aparte su respuesta de la pregunta y publíquela como una "respuesta" a esta pregunta. –

+0

@GtotheB: ¿Qué pasó cuando trataste de publicar una respuesta? Puede haber una reputación mínima requerida, pero si es así, no estaba al tanto. Si ese es el caso, valdría la pena volver a esta pregunta y publicar una respuesta una vez que haya ganado más representante. – outis

+0

@GtotheB: ¿Podría responder su propia pregunta ahora? – kennytm

Respuesta

51

Después de algunas (muchas) búsquedas en toda la web, encontré la respuesta. El grupo de acceso que utiliza al construir su clase KeychainItemWrapper también debe especificarse en cada uno de los archivos de Entitlements.plist de su aplicación en la sección "keychain-access-groups".

Parece casi obvio ahora que veo "keychain-access-groups". Sin embargo, no tenía ni idea de siquiera mirar allí. Espero que esto ayude a otros.

+3

Encontré el siguiente enlace bastante útil para dar más detalles. http://useyourloaf.com/blog/2010/04/03/keychain-group-access.html – DBD

+4

Tenga cuidado, en el nuevo XCode (4.5.2), hay una configuración para los grupos de llaveros en la pestaña de resumen de la aplicación en la configuración. Puede establecer el nombre del grupo allí, pero XCode inteligente antes de $ (AppIdentifierPrefix) pero no lo muestra en el resumen. Puede verlo en un archivo plist real y editar allí. En resumen, si está configurando el grupo de llavero desde la página de resumen, NO escriba el ID de semilla del paquete, XCode lo agrega automáticamente. Y lo esconde en la página de resumen, porque es, bueno, un software de Apple. – mentat

+0

Tengo una pregunta de seguimiento: ¿Sus aplicaciones tienen el mismo ID de semilla del paquete/desarrollador? ¿O acabas de utilizar el derecho de Entitlements.plist para compartir los datos entre los grupos de llaveros? – radj

13

En realidad, no es difícil de hacer. Por favor sigue los pasos.

App1:

  1. abrir su aplicación de las capacidades de destino y permitir Llavero Compartir.
  2. Agregue un identificador. (por ejemplo: com.example.sharedaccess)
  3. Agregue "UICKeyChainStore" a su proyecto.
  4. Asegúrese de tener una identificación de equipo agregada a su proyecto de App1.
  5. Agregue Security.framework a su proyecto de App1.
  6. Y agrega estos códigos a algún lugar que necesites.

    [UICKeyChainStore setString:@"someValue" forKey:@"someKey" service:@"someService"]; 
    

App2:

  • abrir su aplicación de las capacidades de destino y permitir Llavero Compartir.
  • Agregue un identificador. (por ejemplo: com.example.sharedaccess)
  • Agregue "UICKeyChainStore" a su proyecto.
  • Asegúrese de tener una identificación de equipo agregada a su proyecto de App2.
  • Agregue Security.framework a su proyecto de App2.
  • Y agrega estos códigos a algún lugar que necesites.

    NSString *string = [UICKeyChainStore stringForKey:@"someKey" service:@"someService"]; 
    
  • Sus TeamIDs debe ser el mismo para ambos proyectos.

  • Probé estos pasos en un dispositivo de iPhone real.
  • También probé estos pasos con Automático y iOs Development perfil de aprovisionamiento.
  • Los identificadores de paquetes de mis aplicaciones eran así: com.example.app1, com.example.app2.
+2

Tenga en cuenta que "Como puede ver, no estamos especificando el grupo de acceso. De manera predeterminada, elegirá el primer grupo de acceso especificado en su Entitlements.plist cuando escriba y lo hará buscar en todos los grupos de acceso cuando no se especifica ninguno ". – onmyway133

+0

@alicanbatur, ¡genial! Una cosa para notar, el proceso anterior no funcionó si no se especificó el "servicio". – sabiland

+0

me salvas mucho @alicabatur. Gracias. – Sanju

Cuestiones relacionadas