我一直在圍繞蘋果論壇進行挖掘,因此對於這個問題無濟於事。使用Apple的KeychainItemWrapper(ARCified),嘗試將kSecAttrAccessible
屬性設置爲除默認值(kSecAttrAccessibleWhenUnlocked
)以外的任何內容都會導致SecItemUpdate的斷言失敗,返回錯誤。iOS8 + Apple的KeychainItemWrapper導致崩潰
KeychainItemWrapper *wrapper = [[KeyChainItemWrapper alloc] initWithIdentifier:kMyIdentifier accessGroup:nil];
[wrapper setObject:kMyServiceName forKey:(__bridge NSString*)kSecAttrService];
[wrapper setObject:kMyAccountToken forKey:(__bridge NSString*)kSecAttrAccount];
[wrapper setObject:(__bridge NSString*)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge NSString*)kSecAttrAccessible];
我們的鑰匙扣更新的其餘部分似乎通過罰款去,但在最後一行的結果:
*** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/john.hammerlund/.../KeychainItemWrapper.m:299
斷言失敗是由於SecItemUpdate()返回-50狀態,這似乎是一個通用的「無效參數」錯誤。
立即設置kSecAttrAccessible
密鑰沒有任何影響,但將其設置爲默認值kSecAttrAccessibleWhenUnlocked
可以緩解問題(但消除了這一點)。 This other question是我發現的與iOS 8有關的唯一附加信息,導致KeychainItemWrapper崩潰。使用iOS 7或iOS 7/8上的模擬器構建設備可消除此問題;它只是使用的是iOS 8
更新真實設備上燃燒起來
這裏的查詢字典進行了全面概述:
{ accc = "<SecAccessControlRef: 0x1687cc70>"; acct = ...; agrp = ...; cdat = "2014-10-13 22:22:47 +0000"; desc = ""; gena = ...; labl = ""; mdat = "2014-10-13 22:34:16 +0000"; pdmn = cku; <-- kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly svce = ...; sync = 0; tomb = 0; "v_Data" = <>; }
和attributesToUpdate參數:
{ accc = "<SecAccessControlRef: 0x1687cc70>"; acct = ...; agrp = ...; cdat = "2014-10-13 22:22:47 +0000"; desc = ""; gena = ...; labl = ""; mdat = "2014-10-13 22:34:16 +0000"; pdmn = ak; <-- kSecAttrAccessibleWhenUnlocked svce = ...; sync = 0; tomb = 0; "v_Data" = <>; }
我c確認改變其他領域(即kSecAttrService,kSecAttrAccount)對在字典中的相應字段相同的效果,但隨着0
你將不得不轉儲傳遞給'writeToKeychain'中的'SecItemUpdate'的2個字典,這樣你就可以看到問題 – 2014-10-13 17:31:38
@John對此有任何更新? – 2015-11-29 12:22:17
已經有一段時間了,但是謝謝@singhSan讓我回到這裏。我認爲這是一個蘋果的錯誤,如下所述。 – John 2015-11-30 16:27:31