2015-11-02 174 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不會允許您的應用程序在使用密碼進行保護時對鑰匙串進行更改。