无法在swift中使用userdefaults登录所有注册用户



在我的代码中,我无法登录所有注册用户,我只能登录最后一个注册用户。这里loginVC正在检索最后一个注册用户。如何将所有注册用户的详细信息保存在userdefaults中以登录所有用户?

InloginVC:

class ViewController: UIViewController 
{
@IBOutlet weak var userNameTextfield: UITextField!
@IBOutlet weak var passwordTextfield: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
if UserDefaults.standard.bool(forKey: "USER_LOGIN") {
//navigate to home page
DispatchQueue.main.async {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
@IBAction func loginBtnClicked(_ sender: Any) {

let uName = UserDefaults.standard.string(forKey: "userName")
let uPassword = UserDefaults.standard.string(forKey: "userPassword")
if userNameTextfield.text == uName && passwordTextfield.text == uPassword{
UserDefaults.standard.set(true, forKey: "USER_LOGIN")
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
navigationController?.pushViewController(vc, animated: true)
}
else{
showAlert(title: "LogIn", message: "please enter username and password")
}
}

在registeredVC:

class RegisterViewController: UIViewController {
@IBOutlet weak var firstNameTextfield: UITextField!
@IBOutlet weak var lastNameTextfield: UITextField!
@IBOutlet weak var emailTextfield: UITextField!
@IBOutlet weak var passwordTextfield: UITextField!
@IBAction func registerBtnClicked(_ sender: Any) {

if firstNameTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration", message: "please enter first name")
}
else if lastNameTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration", message: "please enter last name")
}else if emailTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration", message: "please enter email")
}else if passwordTextfield.text?.isEmpty == true{
self.showAlert(title: "Registration", message: "please enter password")
}
else{

let fName = firstNameTextfield.text!
let lName = lastNameTextfield.text!
let userNameReg =  fName + " " + lName

UserDefaults.standard.set(userNameReg, forKey: "userName")
UserDefaults.standard.set(lastNameTextfield.text, forKey: "lastName")
UserDefaults.standard.set(emailTextfield.text, forKey: "email")
UserDefaults.standard.set(passwordTextfield.text, forKey: "userPassword")
UserDefaults.standard.set(true, forKey: "USER_LOGIN")
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
navigationController?.pushViewController(vc, animated: true)        }
}
}

如何自动登录所有注册用户,请做代码帮助。

你保存用户名和密码的代码在几个层面上是有缺陷的,应该重写。

  1. 不要将用户名和密码等安全信息存储为用户默认值。正如Eric Aya指出的那样,这是一个巨大的安全漏洞。

  2. 每次使用相同的密钥保存当前用户名和密码。您编写的代码是为了保存当前用户,而不是用户/密码数组。如果想要保留用户/密码数组,则必须保存用户/密码数组。(设置代码以维护用户/密码数组。读取的数组来自安全存储的当前值。当用户输入新的用户名时,将其添加到数组中,并将该数组重新保存到安全存储中。

您正在尝试的设置如下。

KeychainWrapper.standard.set([passwordTextfield.text], forKey: "userPassword")

这样你所做的就是总是设置当前密码的新数组列表擦除旧数据。(这是错误的)

你可以这样做

步骤1:首先获取存储数据的数组列表

var currentArrayList = KeychainWrapper.standard.get(forKey: "RegisteredUsers")

E。X数组列表如下:

[
{
"username": "user01",
"password": "123456"
},
{
"username": "user02",
"password": "123456"
}
]

步骤2:当注册时,将此用户对象添加到上述数组列表中。

现在,如果您输入new user,您将把该用户添加到数组列表中。

currentArrayList.append(newUserObject)

步骤3:Save this arraylist back to Keychain*

KeychainWrapper.standard.set(currentArrayList, forKey: "RegisteredUsers")

注意:必须保存整个user对象,而不仅仅是username &单独的密码。

最新更新