iOS中的钥匙串实际上有效吗?

时间:2011-08-12 15:31:08

标签: iphone objective-c ios

我一直在尝试使用iOS中的钥匙串存储一些小信息 - 密码字符串,OAuth令牌等。我正在使用Apple提供的KeychainItemWrapper示例代码: https://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007797

我发现它非常多!有时候它会起作用,有时我的应用程序在尝试将字符串值存储在钥匙串中时会崩溃,特别是在已经设置了某些内容时。其他时候,完全相同的调用工作正常。错误发生在实际设备上,而不是模拟器中。

我通常写入钥匙串的方式是这样的:

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

所以,我想知道的是:我做错了什么,Apple的示例代码是否应该受到指责,或者实际的底层iOS钥匙串API是否已损坏?

3 个答案:

答案 0 :(得分:4)

我发现SFHFKeychainUtilities是一个非常有用的包装器。它提供了一个非常简单的API,如下所示:

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

这是一个有用的教程:http://gorgando.com/blog/tag/sfhfkeychainutils

一直为我工作。

祝你好运!

答案 1 :(得分:3)

这个Wrapper我遇到了很多问题。我不知道为什么,但您必须使用相同的标识符保存到KSecAttrAccount,然后再保存kSecValueData。

像这样保存:

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

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

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

答案 2 :(得分:1)

Apple的KeychainItemWrapper确实有用 - 我在我的一个应用程序中使用它来存储IAP数据。然而,我发现,如果你的设备被越狱,它似乎并不总是有效。不知道设备越狱时钥匙串会发生什么变化,但我的一些beta测试人员报告说,当他们的设备被越狱时,IAP并不总是适用。

您似乎正在正确使用该课程。