我一直在尝试使用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是否已损坏?
答案 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并不总是适用。
您似乎正在正确使用该课程。