我正在使用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个不同的钥匙串物品时,为什么会引发错误?我怎样才能使它按需工作?

最佳答案

您已经有一个带有“新”用户名和相同的其他主键(帐户,服务等)的钥匙串项目,而不是您要更新的项目。因此,更新后的商品与旧商品发生冲突,您将获得–25299。

您可以使用SecItemCopyMatching添加一些调试代码(询问数组结果)并进行查找。

如果确定您不希望使用旧项目,请将其删除。如果这样做,则需要一个新的命名方案。

关于ios - KeychainItemWrapper迁移数据引发错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15639597/

10-10 20:50
查看更多