我的iOS应用程序有一个登录界面。 用户名和密码将保存在NSUserDefaults中,并在再次进入应用程序时再次加载到登录屏幕中(当然,NSUserDefaults是永久的)。
现在,用户可以禁用用户名/密码保存功能。
NSUserDefaults会被清除。
但是在我的应用程序中,我需要这个用户名/密码的数据库查询用户。 所以:哪里存储数据除了NSUserDefaults? (这个地方可以/应该在用户退出应用程序或登出时删除)。
我的iOS应用程序有一个登录界面。 用户名和密码将保存在NSUserDefaults中,并在再次进入应用程序时再次加载到登录屏幕中(当然,NSUserDefaults是永久的)。
现在,用户可以禁用用户名/密码保存功能。
NSUserDefaults会被清除。
但是在我的应用程序中,我需要这个用户名/密码的数据库查询用户。 所以:哪里存储数据除了NSUserDefaults? (这个地方可以/应该在用户退出应用程序或登出时删除)。
当前回答
更新这个问题:
对于那些使用Swift签出的人来说,Mihai Costea支持的拖放Swift实现访问组:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
使用钥匙串前: 存储密码前要三思。在许多情况下,存储一个身份验证令牌(例如持久性会话id)和电子邮件或帐户名可能就足够了。您可以很容易地使身份验证令牌失效,以阻止未经授权的访问,要求用户在受威胁的设备上再次登录,但不需要重置密码,并且必须在所有设备上再次登录(我们不仅使用Apple是吗?)
其他回答
如果你的应用有一个相关的域,最好使用管理共享凭证。它将为用户提供最好的体验,并由系统本身进行管理。
步骤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.
}
现在你已经准备好了。 阅读更多…? !
一个非常简单的解决方案通过钥匙链。
它是系统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是密码和其他信息的用户/对象。
如果您需要ARC版本的包装器,请访问https://gist.github.com/1170641 多亏了
试试这个:
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];
[keychainItem setObject:@"password you are saving" forKey:kSecValueData];
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];
希望它能有所帮助。
更新这个问题:
对于那些使用Swift签出的人来说,Mihai Costea支持的拖放Swift实现访问组:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
使用钥匙串前: 存储密码前要三思。在许多情况下,存储一个身份验证令牌(例如持久性会话id)和电子邮件或帐户名可能就足够了。您可以很容易地使身份验证令牌失效,以阻止未经授权的访问,要求用户在受威胁的设备上再次登录,但不需要重置密码,并且必须在所有设备上再次登录(我们不仅使用Apple是吗?)