¿Es posible usar la authentication Touch ID y el uso compartido de llaveros en una aplicación iOS?

He estado con éxito en condiciones de aplicar TouchID con llavero, así como llavero Sharing (synchronization de elementos llavero entre varios dispositivos) por separado. Cuando trato de hacer ambos, obtengo un error "-50", que es un parámetro no válido. Desde el código de abajo, ya sea eliminando o kSecAttrAccessControl kSecAttrSynchronizable funciona como se espera.

Sobre la base de mi experiencia (leer – unos días de frustración) hasta el momento, y en function de las capacidades de algunas herramientas de simplificación de API de llavero como UICKeychainStore , parece que si utilizo la authentication de Touch ID, Compartir llavero no funcionaría y viceversa. Estoy buscando una documentation de Apple que indique eso, pero no puedo encontrarla.

He revisado la página SecItem.h de Apple y una información útil que encontré indica lo siguiente sobre kSecAttrAccessible y kSecAttrSynchronizable : "Si ambos attributes están especificados en OS X o iOS, el valor de la key kSecAttrAccessible puede ser solo uno cuyo nombre no termina con "ThisDeviceOnly", ya que no pueden sincronizarse con otro dispositivo ". Sin embargo, no estoy usando" ThisDeviceOnly "(actualmente estoy usando kSecAttrAccessibleAlways para propósitos de testing)

¿Puedes ayudar a señalar si Apple ha documentado esta limitación y dónde? Eso me ayudaría a documentarlo para los loggings, y seguir adelante. Gracias.

- (void)addKeychainItemWithIdentifier:(NSString *)identifier andData:(NSData *)data { CFErrorRef error = NULL; SecAccessControlRef sacObject; sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleAlways, kSecAccessControlUserPresence, &error); if(sacObject == NULL || error != NULL) { NSString *msg0 = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_CAN_CREATE_OBJECT", nil), error]; [self printResultWithMessage:msg0]; return; } NSDictionary *attributes = @{ (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecValueData: data, (__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleAlways, (__bridge id)kSecAttrService: identifier, (__bridge id)kSecAttrSynchronizable:(__bridge id)kCFBooleanTrue, (__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject }; dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil); NSError *statuserror = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil]; [self printResultWithMessage:[self keychainErrorToString:status]]; }); } 

Creo que puedo haber encontrado la respuesta a esto

En el video 711 de la WWDC 2014, se menciona lo siguiente a las 31:48

Elementos protegidos de ACL: sin synchronization, sin respaldo

Por lo tanto, la authentication Touch ID no se puede usar para compartir llaveros entre dispositivos, ya que esos artículos son solo dispositivos

Este proyecto de ejemplo podría ayudar, el título es KeychainTouchID: usando Touch ID con Keychain y LocalAuthentication :

https://developer.apple.com/library/ios/samplecode/KeychainTouchID/Introduction/Intro.html

Esto podría estar limitado a local, sin compartir.