2011-11-03 47 views
12

我正在更新iPhone application,並對其默認配置稍作更改。不過,自從我創建它以來,已經有一段時間了,所以我已經將Xcode升級到了4.2,並且在最新版本中包含了iOS 5支持。iOS Keychain SecItemAdd返回-25243

當我去測試設備上,我得到以下斷言錯誤:

2011-11-02 20:57:18.869 RoseBandwidth[903:707] Tried to add item, got result: -25243 
2011-11-02 20:57:18.870 RoseBandwidth[903:707] *** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/tim/code/RoseBandwidth/Classes/KeychainItemWrapper.m:312 
2011-11-02 20:57:18.872 RoseBandwidth[903:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.' 

我使用的是蘋果的GenericKeychain projectKeychainItemWrapper類的實現。值得注意的是,這個錯誤只出現在設備上,而不是在模擬器中(我意識到平臺之間的訪問組限制差異,但通常我認爲在模擬器上導致了問題,而不是實際的硬件)。

爲什麼我會收到此錯誤?我沒有觸及任何與應用程序中與鑰匙鏈相關的部分;它存儲和檢索數據就像以前一樣。

回答

18

好的,我無法完成您的項目,但從How to share keychain data between iOS applications我想您可能想檢查您的權利文件。至少在github項目中,您沒有在Keychain訪問組中指定任何內容。

+0

如果可以的話,我會多次提醒你 - 這個回答完全是神奇的。事實證明,我在途中丟失了我的權利文件,因此重新啓用它們(並在一段時間內使用配置文件)解決了此問題。謝謝! – Tim

9

對於未來的搜索者來說,碰巧在這裏結束,另一個可能的原因是-25243錯誤(意思是No access control,BTW)正在模擬器上運行。

我最好的理論是應用程序的供應配置文件(或其簽名)是應用程序如何知道它的捆綁包種子是什麼。捆綁種子需要成爲您的鑰匙串訪問組名稱的一部分。但是,在模擬器上運行的應用程序不會被簽名,所以有一個缺失的(或不同的?)捆綁包種子比您指定的keychain-access-group

什麼的。它的記錄都很差,很難說出什麼。試着在設備上運行它,看看是否有幫助。

+0

這是一個好點 - 感謝提高它。我注意到在我原來的問題中,我使用Apple的[KeychainItemWrapper](https://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html#//apple_ref/doc/uid/DTS40007797 -Classes_KeychainItemWrapper_m-DontLinkElementID_10)類,它包含一個編譯器'#if'子句來檢查應用程序是否在模擬器上運行。沒有使用這種包裝的人需要採取預防措施。 – Tim

+0

謝謝你,jemmons。幫助我很多 – makaron

3

即使我沒有觸摸代碼,我也會在模擬器中不時得到相同的錯誤。模擬器的重置爲我解決了這個問題。

看到這個問題/答案如何重置模擬器:https://stackoverflow.com/a/3442326

+0

+1:好吧,這很煩人...我遇到了與模擬器相同的問題(並且重置肯定會修復它),但是(我相信)它不會在設備上發生。你有沒有看到這種隨機發生在設備上? –

+0

不,我到目前爲止尚未在設備上看到此錯誤。 – ToniTornado

1

正如其他人所指出的那樣,在設備構建錯誤-25243通常是由試圖訪問您沒有權限的鑰匙串訪問組引起對於。 (它從您的Entitlements.plist文件或配置文件中缺失。)

但是在模擬器中可能存在另一個原因。模擬器不支持鑰匙串訪問組,所有,所以如果你設置鑰匙鏈項目上的kSecAttrAccessGroup屬性,並嘗試寫它,你會得到這個-25243錯誤代碼。

僅供參考,蘋果GenericKeychain示例代碼有此評論:

// Ignore the access group if running on the iPhone simulator. 
// 
// Apps that are built for the simulator aren't signed, so there's no keychain access group 
// for the simulator to check. This means that all apps can see all keychain items when run 
// on the simulator. 
// 
// If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the 
// simulator will return -25243 (errSecNoAccessForItem). 
4

對於那些你得到這個錯誤,並試圖達到兩個應用程序之間「共享密鑰鏈訪問」:

您需要創建在您首次啓動「功能」中的「共享鑰匙串訪問」時選擇了與您選擇的相同團隊ID的應用的應用ID。在這裏創建應用ID: Apple Member Center

之後,你需要創建從應用程序ID供應文件並將其下載到您的計算機(雙擊它安裝到X-代碼)

我想你已經知道你需要「應用程序ID前綴」訪問鑰匙鏈,但對於那些誰不知道: 「應用程序ID前綴」是您的蘋果開發者帳戶關聯的唯一文本標識:enter image description here

要訪問「SharedKeychain」您需要在嘗試寫入密鑰鏈或從密鑰鏈讀取之前像這樣實現它

keychainAccessGroupName = "AB123CDE45.myKeyChainGroup"

你可以看看這個教程進一步信息:Share Keychain between iOS apps.

希望有所幫助。

0

當我使用生產證書和供應配置文件時,這對我有效。使用調試不起作用。

0

以我的經驗,我得到的返回值-25243當我意識到我是想用kSecMatchLimitOnekSecReturnDatakCFBooleanTrue值傳遞kSecMatchLimitSecItemAdd()功能。我刪除了這些,並重複檢查應用ID和配置文件,一切都很好。

我不確定這是否有幫助,但根據我的經驗,如果您將使用SecItemAdd()函數進行共享鑰匙串訪問,那麼這兩個參數不得存在。

相關問題