我已经成功地实现了具有钥匙串的TouchID以及钥匙串共享(分别在多个设备之间同步钥匙串项目).当我尝试做这两个,我得到一个错误“-50”这是无效的参数.
从以下代码中,删除kSecAttrAccessControl或kSecAttrSynchronizable可以按预期方式工作.
从以下代码中,删除kSecAttrAccessControl或kSecAttrSynchronizable可以按预期方式工作.
根据我迄今为止的经验(阅读 – 几天的沮丧),并且基于像UICKeychainStore这样的一些钥匙串API简化tools的功能,似乎如果我使用Touch ID身份验证,钥匙串共享将无法正常工作,反之亦然.我正在寻找一个苹果文档,将声明,但无法找到它.
我已经通过了苹果的SecItem.h页面,并发现一个有用的信息,我发现以下关于kSecAttrAccessible和kSecAttrSynchronizable:
“如果在OS X或iOS上都指定了两个属性,那么kSecAttrAccessible键的值只能是一个名称不以”ThisDeviceOnly“结尾,因为它们不能同步到另一个设备.”但是,我没有使用“ ThisDeviceOnly“(我目前正在使用kSecAttrAccessibleAlways进行测试)
你能帮助指出苹果如何记录这个限制?这将帮助我记录下来的记录,并继续前进.谢谢.
- (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]]; }); }
解决方法
我想我可能已经找到了答案
在WWDC 2014视频711中,以下在31:48提到
ACL Protected Items – No Synchronization,No Back up
因此,Touch ID身份验证不能用于设备之间的钥匙串共享,因为这些项目是仅限于设备的