【发布时间】:2011-03-09 15:20:50
【问题描述】:
我对 iOS 开发非常陌生,如果这是一个新手问题,请原谅我。我的应用程序有一个简单的身份验证机制,它接受用户的电子邮件地址和密码。我还有一个开关,上面写着“记住我”。如果用户打开该开关,我想保留他们的电子邮件/密码,以便将来可以自动填充这些字段。
我已经将它保存到 plist 文件中,但我知道这不是最好的主意,因为密码是未加密的。我找到了一些保存到钥匙串的示例代码,但说实话,我有点迷茫。对于下面的函数,我不知道如何调用它以及如何修改它以保存电子邮件地址。
我猜它会是:saveString(@"passwordgoeshere");
感谢您的帮助!!!
+ (void)saveString:(NSString *)inputString forKey:(NSString *)account {
NSAssert(account != nil, @"Invalid account");
NSAssert(inputString != nil, @"Invalid string");
NSMutableDictionary *query = [NSMutableDictionary dictionary];
[query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
[query setObject:account forKey:(id)kSecAttrAccount];
[query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible];
OSStatus error = SecItemCopyMatching((CFDictionaryRef)query, NULL);
if (error == errSecSuccess) {
// do update
NSDictionary *attributesToUpdate = [NSDictionary dictionaryWithObject:[inputString dataUsingEncoding:NSUTF8StringEncoding]
forKey:(id)kSecValueData];
error = SecItemUpdate((CFDictionaryRef)query, (CFDictionaryRef)attributesToUpdate);
NSAssert1(error == errSecSuccess, @"SecItemUpdate failed: %d", error);
} else if (error == errSecItemNotFound) {
// do add
[query setObject:[inputString dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];
error = SecItemAdd((CFDictionaryRef)query, NULL);
NSAssert1(error == errSecSuccess, @"SecItemAdd failed: %d", error);
} else {
NSAssert1(NO, @"SecItemCopyMatching failed: %d", error);
}
}
【问题讨论】:
-
我修复了 @Anomie 的代码以使用 ARC 并将其放在 Github 上(我链接到这个答案并在两个文件中都提到了你的用户,但如果你想进一步说明,请告诉我)。我还稍微更改了格式并使方法名称更加通用。 github.com/jeremangnr/JNKeychain
标签: ios