2015-11-02 56 views
1

我正面临一个奇怪的问题。非常类似于这里问的一个,但没有回答:Read from keychain results in errSecItemNotFound 25300iOS钥匙串随机返回-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

我可以看到这个问题是旧的,但我最近几乎疯了试图解决类似问题的钥匙扣,所以在任何情况下,它面临着我将分享它。

问题在于,在写入背景中的钥匙串时,应用程序会随机崩溃。原因在于,当用户在手机上拥有密码并且选定的访问级别最安全时,iOS不会允许您的应用程序在使用密码进行保护时对钥匙串进行更改。