2011-08-12 19 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];