簡體   English   中英

iOS8 + Apple的KeychainItemWrapper導致崩潰

[英]iOS8 + Apple's KeychainItemWrapper results in a crash

我一直在圍繞Apple論壇挖掘這個問題無濟於事。 使用Apple的KeychainItemWrapper(ARCified),嘗試將kSecAttrAccessible屬性設置為除默認值( kSecAttrAccessibleWhenUnlocked )之外的任何內容,導致SecItemUpdate返回錯誤的斷言失敗。

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緩解問題(但消除了這一點)。 另一個問題是我發現的與iOS 8有關的唯一其他信息導致KeychainItemWrapper崩潰。 在iOS 7/8上構建iOS 7或模擬器的設備消除了這個問題; 它只是在使用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" = <>; }

我已經確認更改其他字段(即kSecAttrService,kSecAttrAccount)對字典中的相應字段具有相同的效果,但預期狀態為0。

我有同樣的問題。 我最終測試了kSecAttrAccessibile,如果它不是我想要的,我在局部變量的keychain中記錄了值和屬性,重置了keychain,根據需要設置了kSecAttrAccessible,然后將keychain中的值和屬性設置為原始設置。

在黑暗中拍攝:

也許iOS設備啟用了iCloud同步並添加了一個非特定於設備的項目然后使其成為ThisDeviceOnly會導致錯誤。 iOS8也可能改變了行為。

您可以嘗試更改設置為keychain的屬性的順序

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];
    }

我也遇到了確切的問題。 給我:

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

更新后,應用程序商店中的所有用戶都崩潰了。

和彼得一樣。 抓取數據,刪除項目並將其作為新項目插入,而不是嘗試更新現有項目。

我猜這是一個Apple bug。

我開了一個TSI,但他們還沒有和我聯系。

從我的理解,用戶更新從iOS7到iOS 8,他們的第一個應用程序是用XCode for iOS7編譯的(在iOS 8出來之前),然后在iOS8上更新到使用XCode編譯到iOS8的新應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM