IOS开发使用KeychainItemWrapper 持久存储用户名和密码
在 IOS 应用中,要求用户输入账户和密码以进行身份验证是很普遍的需求。但是,为了确保用户输入的凭证不会丢失或者被黑客攻击,我们需要在应用程序中使用安全的方式来存储这些凭证。KeychainItemWrapper 可以帮忙实现安全地存储这些凭证,下面详细介绍一下。
步骤
-
下载 KeychainItemWrapper 库并添加到您的项目中。可以在这里找到 KeychainItemWrapper 库 : https://github.com/ldandersen/KeychainItemWrapper。
-
打开您的项目并导入 KeychainItemWrapper 库所需的文件。对于 Objective-C 项目,需要导入 KeychainItemWrapper.h 和 KeychainItemWrapper.m 文件。对于 Swift 项目,需要导入 KeychainItemWrapper.h 和 KeychainItemWrapperWrapper.swift 文件。确保将它们添加到您的项目中。
-
创建一个 KeychainItemWrapper 的实例对象。
let keychainItem = KeychainItemWrapper(identifier: "UserLoginID",
accessGroup: nil)
-
identifier
:此字符串是唯一标识符的名称,在这个例子中,我们使用字符串“UserLoginID”作为唯一标识符。 -
accessGroup
:此参数可选,用于将共享访问与其他 KeychainItemWrapper 对象关联。它通常用于在组织中使用当个应用程序时共享密码。 -
使用以下方法将用户的登录凭证保存到 iOS 的 Keychain 中:
keychainItem.setObject(username, forKey: kSecAttrLogin as NSString)
keychainItem.setObject(password, forKey: kSecValueData as NSString)
-
kSecAttrLogin
:用户名的键。 -
kSecValueData
:保存密码的键。 -
username
:字符串类型,用户名。 -
password
:字符串类型,密码。 -
完成上述步骤后,您可以使用以下方法从 Keychain 获取数据:
let savedUserName = keychainItem.object(forKey: kSecAttrLogin as NSString) as? String
let savedPassword = keychainItem.object(forKey: kSecValueData as NSString) as? String
- 使用以下方法从 Keychain 中删除数据:
keychainItem.resetKeychain()
示例
示例1 - 登录示例
以下是一个登录示例代码。在此示例中,我们将向用户请求用户名和密码,并在 Keychain 中保存这些凭据。当用户再次打开该应用程序时,登录页将不再显示,而是直接显示受保护的应用程序主页。
class ViewController: UIViewController {
@IBOutlet weak var userNameTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var saveLoginSwitch: UISwitch!
let keychainItem = KeychainItemWrapper(identifier: "UserLoginID", accessGroup: nil)
override func viewDidLoad() {
super.viewDidLoad()
let hasLogin = keychainItem.object(forKey: kSecAttrLogin as NSString) != nil &&
keychainItem.object(forKey: kSecValueData as NSString) != nil
if hasLogin {
// 隐藏登录视图控制器
performSegue(withIdentifier: "showProtectedPage", sender: self)
}
}
@IBAction func loginButtonTapped(_ sender: Any) {
guard let userName = userNameTextField.text, !userName.isEmpty,
let password = passwordTextField.text, !password.isEmpty else {
return
}
if saveLoginSwitch.isOn {
keychainItem.setObject(userName, forKey: kSecAttrLogin as NSString)
keychainItem.setObject(password, forKey: kSecValueData as NSString)
} else {
keychainItem.resetKeychain()
}
// 隐藏登录视图控制器
performSegue(withIdentifier: "showProtectedPage", sender: self)
}
}
示例2 - 保存多个用户示例
以下是一个保存多个用户登录凭证的示例代码。
class ViewController: UIViewController {
@IBOutlet weak var userNameTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var saveLoginSwitch: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
let keychainItem1 = KeychainItemWrapper(identifier: "UserLoginID1", accessGroup: nil)
let keychainItem2 = KeychainItemWrapper(identifier: "UserLoginID2", accessGroup: nil)
let userName1 = keychainItem1.object(forKey: kSecAttrLogin as NSString) as? String
let password1 = keychainItem1.object(forKey: kSecValueData as NSString) as? String
let userName2 = keychainItem2.object(forKey: kSecAttrLogin as NSString) as? String
let password2 = keychainItem2.object(forKey: kSecValueData as NSString) as? String
print("User 1:\n username: \(userName1 ?? "")\n password: \(password1 ?? "")\n")
print("User 2:\n username: \(userName2 ?? "")\n password: \(password2 ?? "")\n")
}
@IBAction func saveButtonTapped(_ sender: Any) {
guard let userName = userNameTextField.text, !userName.isEmpty,
let password = passwordTextField.text, !password.isEmpty else {
return
}
let keychainItem = getKeychainItem()
if saveLoginSwitch.isOn {
keychainItem.setObject(userName, forKey: kSecAttrLogin as NSString)
keychainItem.setObject(password, forKey: kSecValueData as NSString)
} else {
keychainItem.resetKeychain()
}
}
private func getKeychainItem() -> KeychainItemWrapper {
return KeychainItemWrapper(identifier: "UserLoginID1", accessGroup: nil)
}
}
在此示例中,我们创建了两个 KeychainItemWrapper 实例,用于存储两个用户的登录凭证。getKeychainItem()
方法通过标识符返回一个 KeychainItemWrapper 实例。
以上是使用 KeychainItemWrapper 持久存储用户名和密码的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IOS开发使用KeychainItemWrapper 持久存储用户名和密码 - Python技术站