我正面臨一個奇怪的問題。非常類似於這裏問的一個,但沒有回答: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";}
使用寫入鑰匙串和從鑰匙串讀取的代碼更新您的問題。 – rmaddy