2012-03-15 45 views
25

我有這樣的代碼取回從鑰匙串密碼對於一個給定的用戶名的NSString:的iOS SFHFKeychainUtils遇事*有時*錯誤-25308 errSecInteractionNotAllowed

NSError *error = nil; 
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]; 
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error]; 
if(error != nil) 
    // log the error  

大部分時間對於大多數用戶來說,這一切工作正常 - 但對於一些特定的用戶,這似乎調用失敗(並進行不及格)它返回以下錯誤:

The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.) 

這顯然是errSecInteractionNotAllowed - 從我讀過我認爲這意味着要訪問鑰匙鏈需要某種用戶交互。

有沒有人有任何想法爲什麼這個調用可能會失敗的一些特定的用戶只?此鑰匙串條目特定於我的應用程序 - 那麼爲什麼需要任何用戶交互才能訪問它?

任何指針非常感謝...

回答

40

好吧,所以我最終這樣做了。

最終我找出了有問題的用戶在手機上設置了鎖碼。如果電話被鎖定,鑰匙串系統返回這個-25308錯誤。

如果您只需要訪問鑰匙鏈,當應用程序在forground中處於活動狀態時,您將永遠不會看到此問題 - 但是如果您需要在手機鎖定或應用程序處於後臺時繼續處理,那麼您會看到它。

在其他地方我讀過kechain系統的默認訪問屬性是kSecAttrAccessibleAlways - 但我認爲這是過時的。看起來鑰匙串系統的默認訪問屬性是這樣的,即當電話被一個PIN碼鎖定時,這些項目不可用。

修復此問題的方法是更改​​SFHFKeychainUtils代碼,以便在其管理的鑰匙串項目(原始代碼沒有這樣做 - 可能是因爲它是對這些屬性進行預先約會時)上設置特定的kSecAttrAccessible屬性。

SFHFKeychainUtils代碼的此wordpress updated version修復了它 - 搜索kSecAttrAccessible以查看它們添加了可訪問的屬性代碼的位置。

希望這有助於任何人都遇到了此...

+2

我已經驗證了這一點上的iOS4,iOS5的和iOS6的。在所有iOS版本中,如果在設備處於鎖定狀態(例如後臺任務,報亭下載等)時讀取未標記爲kSecAttrAccessibleAlways的數據,則會返回errSecInteractionNotAllowed錯誤代碼。 – 2012-11-12 09:35:41

+5

kSecAttrAccessibleAlways不是一個很好的選擇 - 通過使用類似kSecAttrAccessibleAfterFirstUnlock(或更嚴格的設置,如果適用於您的應用),您可以獲得更多的安全優勢,並且仍然可以避免錯誤。 – frankodwyer 2012-11-12 13:05:42

+0

我可以確認,當應用程序在前臺,但設備被鎖定密碼時,鑰匙串庫給我-25308。謝謝 ! – Magurizio 2013-12-28 12:18:43

相關問題