我的iOS应用程序有一个登录界面。 用户名和密码将保存在NSUserDefaults中,并在再次进入应用程序时再次加载到登录屏幕中(当然,NSUserDefaults是永久的)。
现在,用户可以禁用用户名/密码保存功能。
NSUserDefaults会被清除。
但是在我的应用程序中,我需要这个用户名/密码的数据库查询用户。 所以:哪里存储数据除了NSUserDefaults? (这个地方可以/应该在用户退出应用程序或登出时删除)。
我的iOS应用程序有一个登录界面。 用户名和密码将保存在NSUserDefaults中,并在再次进入应用程序时再次加载到登录屏幕中(当然,NSUserDefaults是永久的)。
现在,用户可以禁用用户名/密码保存功能。
NSUserDefaults会被清除。
但是在我的应用程序中,我需要这个用户名/密码的数据库查询用户。 所以:哪里存储数据除了NSUserDefaults? (这个地方可以/应该在用户退出应用程序或登出时删除)。
当前回答
我尝试使用KeychainItemWrapper (ARC版本),但我发现它的Objective C包装器不如预期的那么健康。
我使用了Kishikawa Katsumi的这个解决方案,这意味着我写了更少的代码,不必使用类型转换来存储NSString值。
存储的两个例子:
[UICKeyChainStore setString:@"kishikawakatsumi" forKey:@"username"];
[UICKeyChainStore setString:@"P455_w0rd$1$G$Z$" forKey:@"password"];
检索的两个例子
UICKeyChainStore *store = [UICKeyChainStore keyChainStore];
// or
UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"YOUR_SERVICE"];
NSString *username = [store stringForKey:@"username"];
NSString *password = [store stringForKey:@"password"];
其他回答
你应该总是使用钥匙链来存储用户名和密码,因为它是安全存储的,只对你的应用程序访问,没有必要在应用程序退出时删除它(如果这是你的担心)。
Apple提供了存储,读取和删除keychain项目的示例代码,下面是如何使用该示例中的keychain包装器类,这极大地简化了keychain的使用。
包括Security.framework(在Xcode 3中右键单击frameworks文件夹并添加现有的框架。在Xcode 4中选择你的项目,然后选择目标,选择Build Phases选项卡,在Link Binary With Files下点击+)和KeychainItemWrapper .h & .m文件到你的项目中,在你需要使用keychain的地方导入。h文件,然后创建这个类的实例:
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
(YourAppLogin可以是任何你选择调用你的钥匙链项目,如果需要,你可以有多个项目)
然后您可以使用以下命令设置用户名和密码:
[keychainItem setObject:@"password you are saving" forKey:kSecValueData];
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];
让他们使用:
NSString *password = [keychainItem objectForKey:kSecValueData];
NSString *username = [keychainItem objectForKey:kSecAttrAccount];
或者使用以下命令删除它们:
[keychainItem resetKeychainItem];
签出这个示例代码 我首先从示例代码中尝试了apple的包装器,但这对我来说要简单得多
你可以简单地使用NSURLCredential,它将在两行代码中保存用户名和密码。
请看我的详细回答。
如果您在使用钥匙串包装器检索密码时遇到问题,请使用以下代码:
NSData *pass =[keychain objectForKey:(__bridge id)(kSecValueData)];
NSString *passworddecoded = [[NSString alloc] initWithData:pass
encoding:NSUTF8StringEncoding];
一个非常简单的解决方案通过钥匙链。
它是系统Keychain的一个简单包装。只需添加SSKeychain.h, SSKeychain。m、SSKeychainQuery.h和SSKeychainQuery.h。m文件到您的项目中,并将Security.framework添加到您的目标。
保存密码:
[SSKeychain setPassword:@"AnyPassword" forService:@"AnyService" account:@"AnyUser"]
查询密码。
NSString *password = [SSKeychain passwordForService:@"AnyService" account:@"AnyUser"];
其中setPassword是你想要保存的值,forService是你想要保存的变量,account是密码和其他信息的用户/对象。