iOS钥匙串随机返回-25300错误代码

4
我遇到了一个奇怪的问题,和这里提出的一个问题非常相似,但没有得到答案: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
请更新您的问题,包含用于读写钥匙串的代码。 - rmaddy
1个回答

6
我看到这个问题很旧,但最近我为了解决与Keychain类似的问题而几乎发疯,所以我想分享一下,以防别人也遇到同样的问题。 问题是当应用在后台写入keychain时会随机崩溃。原因是当用户的手机有密码并且选择的访问级别是最安全的时,iOS将不允许您的应用程序在受密码保护的情况下更改keychain中的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接