我正在使用ARCified KeychainItemWrapper
,但无法将一个钥匙串项目中的数据迁移到另一个项目。基本上我正在尝试将特定于应用程序的项目中的内容复制到共享项目。为简洁起见,我只输入了用户名,因为它在那里失败了。
KeychainItemWrapper *legacyKeychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"mainLogin" accessGroup:@"C35BXHSRSA.com.foo.bar"];
NSString *legacyUser = [legacyKeychainItem objectForKey:(__bridge id)kSecAttrAccount];
self.migratedKeychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"security" accessGroup:@"C35BXHSRSA.com.foo.security"];
// dies here
[self.migratedKeychainItem setObject:legacyUser forKey:(__bridge id)kSecAttrAccount];
它以KeychainItemWrapper
方法writeToKeychain
投掷NSAssert( result == noErr, @"Couldn't update the Keychain Item." );
查看Keychain Services Reference中的错误告诉我
errSecDuplicateItem -25299该项目已存在。
我可以通过硬编码/更改字符串来确认这个问题,并且代码可以正常工作,但我正在尝试迁移数据......所以相同很重要。问题是,为什么当它是2个不同的钥匙串项时会抛出错误,以及如何让它按照需要运行?
答案 0 :(得分:1)
您已经拥有一个带有“新”用户名和相同其他主键(帐号,服务等)的钥匙串项,而且它不是您要更新的那个。所以更新的项目与旧项目冲突,你得到-25299。
您可以使用SecItemCopyMatching添加一些调试代码(询问数组结果)并查看。
如果您确定不想要旧项目,请将其删除。如果你这样做,那么你需要一个新的命名方案。