我遇到了一个奇怪的问题,和这里提出的一个问题非常相似,但没有得到答案:Read from keychain results in errSecItemNotFound 25300
我的代码将一个字符串密码保存在iOS钥匙串中,稍后可以访问该密码。大多数时候它运行得很好,我能够重新安装或设备重启后再次获取密码。
问题:有时非常罕见且难以复制,它不返回密码,而是返回null和错误状态: -25300(errSecItemNotFound)。另一件事是,在iOS 9更新后,这个问题变得更加突出。发生在iOS 9.1上。
现在,我一直在网上寻找解决办法。找到以下与问题有关的信息,但并未解决我的情况:
更新:
设置代码:
问题:有时非常罕见且难以复制,它不返回密码,而是返回null和错误状态: -25300(errSecItemNotFound)。另一件事是,在iOS 9更新后,这个问题变得更加突出。发生在iOS 9.1上。
现在,我一直在网上寻找解决办法。找到以下与问题有关的信息,但并未解决我的情况:
- iOS Keychain Data Lost Upon iPhone Memory Pressure?
- https://forums.developer.apple.com/thread/4743
- iOS KeyChain not retrieving values from background
更新:
设置代码:
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";}