2014-09-24 80 views
8

我一直在圍繞蘋果論壇進行挖掘,因此對於這個問題無濟於事。使用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

+1

你將不得不轉儲傳遞給'writeToKeychain'中的'SecItemUpdate'的2個字典,這樣你就可以看到問題 – 2014-10-13 17:31:38

+0

@John對此有任何更新? – 2015-11-29 12:22:17

+0

已經有一段時間了,但是謝謝@singhSan讓我回到這裏。我認爲這是一個蘋果的錯誤,如下所述。 – John 2015-11-30 16:27:31

回答

2

我也有確切的問題。遞給我:

OSStatus錯誤-50 - 衝突的kSecAccess和kSecAccessControl屬性

墜毀我在App Store更新他們剛剛經過的所有用戶。

和Peter一樣。抓住數據,刪除項目並將其作爲新項目插入,而不是嘗試更新現有項目。

我想這是一個蘋果的錯誤。

我打開了一個TSI,但他們還沒有聯繫我。

據我所知,它發生在從iOS7更新到iOS8的用戶,他們的第一個應用程序是使用XCode for iOS7編譯的(在iOS8出來之前),然後在iOS8上更新爲已編譯的新應用程序與XCode到iOS8。

2

預期的狀態在黑暗中這裏的一個鏡頭:

也許iOS設備已啓用iCloud的synching並添加不是特定於設備的項目,然後使其ThisDeviceOnly導致錯誤。 iOS8也可能改變了行爲。

你可以嘗試改變被設置到鑰匙串

KeychainItemWrapper *wrapper = [[KeyChainItemWrapper alloc] initWithIdentifier:kMyIdentifier accessGroup:nil]; 
[wrapper setObject:(__bridge NSString*)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge NSString*)kSecAttrAccessible]; 
[wrapper setObject:kMyServiceName forKey:(__bridge NSString*)kSecAttrService]; 
[wrapper setObject:kMyAccountToken forKey:(__bridge NSString*)kSecAttrAccount]; 

如果這沒有幫助屬性的順序,你應該改變KeychainItemWrapper看起來像這樣

- (void)resetKeychainItem 
{ 
    if (!keychainItemData) 
    { 
     keychainItemData = [[NSMutableDictionary alloc] init]; 
     [keychainItemData setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible]; 
    } 
+0

是的,除pdmn值和accc參考值之外的所有值都是相同的。 – John 2014-10-17 21:08:41

+0

我更新了答案。你有沒有嘗試過這裏提到的? – 2014-10-20 20:49:59

+0

我沒有...骰子。我一直在挖掘這個包裝好幾個小時,但仍然無法弄清楚。 – John 2014-10-21 00:29:18

4

我有同樣的問題。我最終測試了kSecAttrAccessibile,如果它不是我想要的,我在本地變量中記錄了鑰匙串中的值和屬性,重置鑰匙串,根據需要設置kSecAttrAccessible,然後將鑰匙串中的值和屬性設置爲其原始設置。

+0

謝謝彼得它找出崩潰的原因花了很多痛苦。看起來像崩潰是從蘋果結束。希望他們會盡快修復它。我做了同樣的建議,它爲我工作。+ upvoted。 – Allamaprabhu 2015-03-17 07:42:42

+1

@peter我遇到了相同的問題,試圖重置鑰匙串,但仍然出現錯誤。你可以發表一篇關於你如何使這個工作的片段嗎? – rmp 2015-05-14 17:07:02