2015-10-19 50 views
2

我發現有時在嘗試獲取之前通過使用Keychain API成功存儲的安全項時遇到此錯誤。我在設備上運行的應用程序處於後臺狀態並鎖定屏幕時發現它。該設備還沒有鎖定代碼集,這是我打電話的功能:訪問Keychain中的安全項有時會在iOS中返回錯誤-25308(errSecInteractionNotAllowed)

+ (NSString *)findValueForKey:(NSString *)keyStr 
{ 
    NSString *valueStr = @""; 

    if ((keyStr != nil) && (![keyStr isEqualToString:@""])) { 
     NSString *service = [[NSBundle mainBundle] bundleIdentifier]; 

     NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, 
          (__bridge id)kSecAttrService : service, 
          (__bridge id)kSecAttrAccount : keyStr, 
          (__bridge id)kSecReturnData : (__bridge id)kCFBooleanTrue}; 

     CFDataRef cfValue = NULL; 
     OSStatus results = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&cfValue); 

     if ([self checkIfNoError:results]) { 
      valueStr = [[NSString alloc] initWithData:(__bridge_transfer NSData *)cfValue encoding:NSUTF8StringEncoding]; 
     } 

     else { 
      NSLog(@"%@", [self getErrorMessageForStatus:results]); 
     } 
    } 

    return valueStr; 
} 

和項目儲存通過調用這個方法:

+ (BOOL)storeInKeychainWithKey:(NSString *)keyStr withValueStr:(NSString *)valueStr 
{ 
    if ((keyStr != nil) && (![keyStr isEqualToString:@""]) && 
     (valueStr != nil) && (![valueStr isEqualToString:@""])) { 

     NSData *valueData = [valueStr dataUsingEncoding:NSUTF8StringEncoding]; 
     NSString *service = [[NSBundle mainBundle] bundleIdentifier]; 

     NSDictionary *secItem = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, 
           (__bridge id)kSecAttrService : service, 
           (__bridge id)kSecAttrAccount : keyStr, 
           (__bridge id)kSecValueData : valueData}; 

     CFTypeRef result = NULL; 

     OSStatus status = SecItemAdd((__bridge CFDictionaryRef)secItem, &result); 

     NSLog(@"%@", [self getErrorMessageForStatus:status]); 

     return [self checkIfItem:status]; 
    } 
    else { 
     return NO; 
    } 
} 

我認爲鑰匙串項目總是在iOS的訪問......這post似乎是關於類似的東西,但我不知道這是否是已被廢棄,我應該怎麼解決這個...提前

感謝

回答

0

我們遇到了同樣的問題,@AppsDev,並且您提到的帖子是準確的。我們解決了這個問題,即使我們卸載/重新安裝應用程序,也可以將鑰匙串作爲我們需要的東西的最後一招。

我們現在循環迴應應用默認值(在Swift 3中爲UserDefaults.standard),以便在安裝生命週期未達到「卸載」階段時方便地保持該信息。

如果未安裝,下次安裝時我們會轉到鑰匙串(根據定義,剛安裝的應用程序不在後臺,因此不會失敗)。通過檢索數據,我們刷新了應用程序的默認值,並從那裏開始使用應用程序的默認值。

相關問題