我正在使用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." );
查找密钥链服务参考中的错误告诉我
errSecDuplicateItem -25299项目已经存在.
我可以通过硬编码/修改字符串来确认这个问题,并且代码可以很好地工作,但是我正在尝试迁移数据.所以相同是很重要的。问题是,当它是两个不同的键链项时,为什么会抛出一个错误?我是如何让它按需要工作的呢?
发布于 2013-04-24 14:49:05
您已经有了一个具有“新”用户名和相同的其他主键(帐户、服务等)的密钥链项,并且它不是您正在更新的。因此,更新的项与旧项发生冲突,您将得到-25299。
您可以使用SecItemCopyMatching添加一些调试代码(询问数组结果)并查看。
如果你确定你不想要旧的项目,删除它。如果你这样做了,那么你需要一个新的命名方案。
https://stackoverflow.com/questions/15639597
复制相似问题