我的iOS应用程序有一个登录界面。 用户名和密码将保存在NSUserDefaults中,并在再次进入应用程序时再次加载到登录屏幕中(当然,NSUserDefaults是永久的)。
现在,用户可以禁用用户名/密码保存功能。
NSUserDefaults会被清除。
但是在我的应用程序中,我需要这个用户名/密码的数据库查询用户。 所以:哪里存储数据除了NSUserDefaults? (这个地方可以/应该在用户退出应用程序或登出时删除)。
我的iOS应用程序有一个登录界面。 用户名和密码将保存在NSUserDefaults中,并在再次进入应用程序时再次加载到登录屏幕中(当然,NSUserDefaults是永久的)。
现在,用户可以禁用用户名/密码保存功能。
NSUserDefaults会被清除。
但是在我的应用程序中,我需要这个用户名/密码的数据库查询用户。 所以:哪里存储数据除了NSUserDefaults? (这个地方可以/应该在用户退出应用程序或登出时删除)。
当前回答
对于swift,你可以使用这个库:
https://github.com/jrendel/SwiftKeychainWrapper
它支持所有版本的swift。
其他回答
我尝试使用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"];
如果您在使用钥匙串包装器检索密码时遇到问题,请使用以下代码:
NSData *pass =[keychain objectForKey:(__bridge id)(kSecValueData)];
NSString *passworddecoded = [[NSString alloc] initWithData:pass
encoding:NSUTF8StringEncoding];
如果你的应用有一个相关的域,最好使用管理共享凭证。它将为用户提供最好的体验,并由系统本身进行管理。
步骤1:
用webcredentials密钥设置您的关联域
步骤2
标记文本框
userIdTextField.textContentType = .username
passwordTextField.textContentType = .password
步骤3
每当用户成功登录时,使用以下代码保存详细信息。iOS将显示一个确认操作表,供用户保存密码。下次用户尝试登录时,键盘将为你的应用程序建议用户凭据。
SecAddSharedWebCredential("www.example.com" as CFString, "user_id" as CFString, "password" as CFString) { error in
if error != nil {
// Handle error
return
}
// The credentials have been successfully saved.
}
现在你已经准备好了。 阅读更多…? !
我决定用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;
享受吧!
试试这个:
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
[keychainItem setObject:@"password you are saving" forKey:kSecValueData];
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];
希望它能有所帮助。