iOS Keychain随机返回-25300

时间:2015-11-02 03:21:50

标签: ios objective-c ios9 keychain

我面临一个奇怪的问题。与此处提出的问题非常类似,但没有回答:Read from keychain results in errSecItemNotFound 25300

我的代码将字符串密码保存在iOS钥匙串中,以便稍后访问。它在大多数情况下工作正常,我可以在重新安装或设备重启后或两者都取回密码。

问题:有时这实际上是罕见且难以重现的,它不会返回密码,而是返回null和错误状态:-25300(errSecItemNotFound)。另一件事是iOS 9更新后这个问题变得突出。也在iOS 9.1上发生。

现在,我一直在网上寻找解决方案。找到以下内容,它以某种方式与问题相关,但不解决我的问题:

有没有人知道为什么会这样?非常感谢。

更新

设置代码:

  NSMutableDictionary *query = [self _queryForService:service account:account];
  [query setObject:password forKey:(__bridge id)kSecValueData]; 
  status = SecItemAdd((__bridge CFDictionaryRef)query, NULL);
}
if (status != errSecSuccess && error != NULL) {
    *error = [NSError errorWithDomain:kAppKeychainErrorDomain code:status userInfo:nil];

}
return (status == noErr);

最终查询:

{
acct = user;
class = genp;
svce = "myBundleIdentifier";
"v_Data" = <36314541 38463339 2d363737 462d3445 34372d42 4339452d 31324633 46463937 35374546>;}

获取代码:

CFTypeRef result = NULL;    
NSMutableDictionary *query = [self _queryForService:service account:account];
[query setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
[query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);

if (status != errSecSuccess && error != NULL) {
    *error = [NSError errorWithDomain:kAppKeychainErrorDomain code:status userInfo:nil];
    return nil;
}

return (__bridge_transfer NSData *)result;

最终查询:

{
acct = user;
class = genp;
"m_Limit" = "m_LimitOne";
"r_Data" = 1;
svce = "myBundleIdentifier";}

1 个答案:

答案 0 :(得分:1)

我可以看到这个问题已经过时了,但我最近几乎疯了,试图解决与Keychain类似的问题,所以如果有人面对它,我会分享它。

问题是当在后台写入钥匙串时,应用程序会随机崩溃。原因是,当用户手机上有密码且选择的访问级别最安全时,iOS将不允许您的应用程序在密码链中进行更改,同时受密码保护。