2011-08-12 25 views
5

我一直在試圖使用iOS的鑰匙串用於存儲信息的一些小位 - 密碼字符串,OAuth憑證,等我用KeychainItemWrapper示例代碼,蘋果提供的位置: https://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007797iOS中的鑰匙串實際上工作嗎?

我我發現它非常錯誤!有時候它可以工作,其他時候我的應用崩潰時,試圖將字符串值存儲在鑰匙串中,特別是當已經設置了某些東西時。其他時候,完全相同的調用工作得很好。錯誤發生在實際設備上,而不是在模擬器中。

我通常寫鑰匙串的方法是這樣的:

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"password" accessGroup:nil]; 
[wrapper setObject:thePasswordString forKey:(id)kSecValueData]; 
[wrapper release]; 

所以,我想知道的是:我做錯了什麼,是從蘋果的示例代碼惹的禍,或爲實際的底層iOS鑰匙串API破裂了?

回答

4

我發現SFHFKeychainUtilities是一個非常有用的包裝。它提供了一個非常簡單的API,它看起來像這樣:

[SFHFKeychainUtils storeUsername:usernameInput andPassword:passwordInput forServiceName:@"foo" updateExisting:TRUE error:&error]; 

這裏是一個有用的教程:http://gorgando.com/blog/tag/sfhfkeychainutils

作品所有的時間對我來說。

祝你好運!

+0

謝謝托馬斯!我已將SFHFKeychainUtils帶入我的應用程序,並且非常好。將測試和錘擊一下,但它似乎是迄今爲止KeychainItemWrapper的巨大改進。獎勵積分讓您輕鬆整合並開始運作。 – Eschaton

+0

威爾多,只是先執行我的盡職調查:) – Eschaton

+0

你絕對應該:)玩得開心。 –

1

來自Apple的KeychainItemWrapper的確的工作 - 我在我的一個應用程序中使用它來存儲IAP數據。然而,我發現,如果你的設備越獄,似乎並不總是奏效。不知道設備越獄後鑰匙串會發生什麼情況,但是我的一些測試人員報告說,當設備越獄時,IAP並不總是適用。

您似乎正在正確使用該類。

+0

我的設備沒有越獄,但並不奇怪,有將與越獄的設備和鑰匙串的問題。無論如何,上面的托馬斯'SFHFKeychainUtils'答案似乎比'KeychainItemWrapper'更可靠。 – Eschaton

+0

我實際上也會考慮'SFHFKeychainUtils', – larsacus

3

我對這個包裝有很多問題。我不知道爲什麼,但必須使用相同的標識符保存到KSecAttrAccount,然後再保存kSecValueData。

保存這樣的:

KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyIdentifier" accessGroup:nil]; 

[keychain setObject:@"MyIdentifier" forKey:(id)kSecAttrAccount]; 

[keychain setObject:[passwordFirst text] forKey:(id)kSecValueData];