iOS钥匙串随机返回-25300
问题描述:
我正面临一个奇怪的问题。非常类似于这里问的一个,但没有回答:Read from keychain results in errSecItemNotFound 25300iOS钥匙串随机返回-25300
我的代码将一个字符串密码保存在iOS密钥链中以便以后访问。它在大多数情况下都能正常工作,并且我可以在重新安装或重新启动设备或两者都取回密码。
问题:有时候哪个实际上很少见并且很难重现,它不会返回密码,而是返回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";}
答
我可以看到这个问题是旧的,但我最近几乎疯了试图解决类似问题的钥匙扣,所以在任何情况下,它面临着我将分享它。
问题在于,在写入背景中的钥匙串时,应用程序会随机崩溃。原因在于,当用户在手机上拥有密码并且选定的访问级别最安全时,iOS不会允许您的应用程序在使用密码进行保护时对钥匙串进行更改。
使用写入钥匙串和从钥匙串读取的代码更新您的问题。 – rmaddy