我的iOS应用程序有一个登录界面。 用户名和密码将保存在NSUserDefaults中,并在再次进入应用程序时再次加载到登录屏幕中(当然,NSUserDefaults是永久的)。

现在,用户可以禁用用户名/密码保存功能。

NSUserDefaults会被清除。

但是在我的应用程序中,我需要这个用户名/密码的数据库查询用户。 所以:哪里存储数据除了NSUserDefaults? (这个地方可以/应该在用户退出应用程序或登出时删除)。


当前回答

试试这个:

 KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
[keychainItem setObject:@"password you are saving" forKey:kSecValueData]; 
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];

希望它能有所帮助。

其他回答

一个非常简单的解决方案通过钥匙链。

它是系统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是密码和其他信息的用户/对象。

对于swift,你可以使用这个库:

https://github.com/jrendel/SwiftKeychainWrapper

它支持所有版本的swift。

如果您在使用钥匙串包装器检索密码时遇到问题,请使用以下代码:

NSData *pass =[keychain objectForKey:(__bridge id)(kSecValueData)];
NSString *passworddecoded = [[NSString alloc] initWithData:pass
                                           encoding:NSUTF8StringEncoding];

我决定用Obj-C和ARC来回答如何在iOS 8中使用钥匙链。

1)我使用了GIST的keychainItemWrapper (ARCifief版本): https://gist.github.com/dhoerl/1170641/download -添加(+复制)KeychainItemWrapper.h和.m到你的项目

2)将安全框架添加到您的项目(签入项目>构建阶段>链接二进制与库)

3)将安全库(#import)和KeychainItemWrapper (#import "KeychainItemWrapper.h")添加到你想使用keychain的.h和.m文件中。

4)保存数据到keychain:

NSString *emailAddress = self.txtEmail.text;
NSString *password = self.txtPasword.text;
//because keychain saves password as NSData object
NSData *pwdData = [password dataUsingEncoding:NSUTF8StringEncoding];

//Save item
self.keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
[self.keychainItem setObject:emailAddress forKey:(__bridge id)(kSecAttrAccount)];
[self.keychainItem setObject:pwdData forKey:(__bridge id)(kSecValueData)];

5)读取数据(可能在加载> viewDidLoad时登录屏幕):

self.keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];

self.txtEmail.text = [self.keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];

//because label uses NSString and password is NSData object, conversion necessary
NSData *pwdData = [self.keychainItem objectForKey:(__bridge id)(kSecValueData)];
NSString *password = [[NSString alloc] initWithData:pwdData encoding:NSUTF8StringEncoding];
self.txtPassword.text = password;

享受吧!

签出这个示例代码 我首先从示例代码中尝试了apple的包装器,但这对我来说要简单得多