【问题标题】:Get value for current user from Firebase Firestore - Swift 4从 Firebase Firestore 获取当前用户的价值 - Swift 4
【发布时间】:2019-08-15 04:45:43
【问题描述】:

这是我的第一个问题,希望你能帮助我。

我一直在尝试为登录我的应用的当前用户获取特定路径。

我现在真的不知道我做错了什么,所以我将我的代码粘贴在这里。

func userRoleListener() {

guard let user = Auth.auth().currentUser else { return } . 
Firestore.firestore().collection("users").document("sjbD5SvKTYHWBLhCqojs").getDocument { (snapshot, error) in
 if let data = snapshot?.data() {
 guard let isAdmin = data["isAdmin"] as? Bool else { return }
   if isAdmin {
    self.applyButton.isHidden = true
   } else {
     self.applyButton.isHidden = false
   }
  }
 }
}

这是我创建用户的函数。

private func createUser() {

        guard let nameAndLastname = nameAndLastnameTextField.text , let email = emailTextField.text , let password = passwordTextField.text , !nameAndLastname.isEmpty , !email.isEmpty , !password.isEmpty else {
            simpleAlert(title: "Error", msg: "Debe completar todos los campos")
            return

        }

        let newUserReference = Firestore.firestore().collection("users").document()

        newUserReference.setData([
            "nameAndLastname": nameAndLastname,
            "email": email,
            "password": password,
            "isAdmin": false,
            "timestamp": Timestamp()
            ])
    }

这是我的登录操作:

@IBAction func signUpButtonPressed(_ sender: Any) {

        guard let email = emailTextField.text , let password = passwordTextField.text , !email.isEmpty , !password.isEmpty else { return }

        self.signUpButton.animateButton(shouldLoad: true, withMessage: "")

        Auth.auth().createUser(withEmail: email, password: password) { (user, error) in
            if let error = error {
                self.signUpButton.animateButton(shouldLoad: false, withMessage: "¡REGISTRAR!")
                debugPrint(error.localizedDescription)
                self.simpleAlert(title: "Error", msg: "Error al iniciar sesión, intente nuevamente en unos minutos")
                return
            }

            self.signUpButton.animateButton(shouldLoad: false, withMessage: "")
            self.createUser()
            self.presentClientStoryboard()

        }

    }

这是我的数据库的图像:

Database image

【问题讨论】:

  • 运行这段代码时出了什么问题?
  • 我遇到的问题是当我尝试这个时: Firestore.firestore.collection("users").document(user.uid).getDocument() 我没有收到任何当前用户,但是当我直接前进并手动插入当前用户ID(“sjbD5SvKTYHWBLhCqojs”)时,该按钮被隐藏并且还从Firestore获取数据。

标签: swift firebase google-cloud-firestore


【解决方案1】:

如果您使用 Firebase 身份验证创建用户,身份验证将在 Firebase 身份验证(不是 Firestore)中为您创建一个用户和一个用户 ID

因此,当您在 Firestore 中创建用户时,您必须将 userID 设置为文档 ID,如下所示:

@IBAction func signUpButtonPressed(_ sender: Any) {

    guard let email = emailTextField.text , let password = passwordTextField.text , !email.isEmpty , !password.isEmpty else { return }

    self.signUpButton.animateButton(shouldLoad: true, withMessage: "")

    Auth.auth().createUser(withEmail: email, password: password) { (user, error) in
        if let error = error {
            self.signUpButton.animateButton(shouldLoad: false, withMessage: "¡REGISTRAR!")
            debugPrint(error.localizedDescription)
            self.simpleAlert(title: "Error", msg: "Error al iniciar sesión, intente nuevamente en unos minutos")
            return
        }

        self.signUpButton.animateButton(shouldLoad: false, withMessage: "")
        self.createUser(user.uid)       // <----- user id from Firebase Auth
        self.presentClientStoryboard()

    }

}

private func createUser(userId: String) {

    guard let nameAndLastname = nameAndLastnameTextField.text , let email = emailTextField.text , let password = passwordTextField.text , !nameAndLastname.isEmpty , !email.isEmpty , !password.isEmpty else {
        simpleAlert(title: "Error", msg: "Debe completar todos los campos")
        return

    }

    let newUserReference = Firestore.firestore().collection("users").document(userId)    // <-- create a document, with the user id from Firebase Auth

    newUserReference.setData([
        "nameAndLastname": nameAndLastname,
        "email": email,
        "password": password,
        "isAdmin": false,
        "timestamp": Timestamp()
        ])
}

【讨论】:

  • 这个有效,我不知道我必须在创建操作中传递用户 ID。非常感谢。
【解决方案2】:

你应该从当前用户那里获取用户ID,试试这个:

func userRoleListener() {

guard let userUid = Auth.auth().currentUser.uid else { return } . 
Firestore.firestore().collection("users").document(userUid).getDocument { (snapshot, error) in
 if let data = snapshot?.data() {
 guard let isAdmin = data["isAdmin"] as? Bool else { return }
   if isAdmin {
// And I believe here the true and false values should be switched as you are checking if the user IS an admin, if they are an admin, shouldn't you show the button?
    self.applyButton.isHidden = false
   } else {
     self.applyButton.isHidden = true
   }
  }
 }
}

此获取的是当前用户登录到应用程序,然后使用用户 uid 搜索数据库。只需确保在创建帐户时相应地保存用户数据。

【讨论】:

  • 我以前试过这个,我有同样的问题,它没有工作。
  • 您能否在用户注册时更新您的代码,也许还可以更新您的数据库照片?
  • 是的,使用上面的答案,您可以通过我的答案获取当前用户信息。希望您发现代码易于阅读和理解。
猜你喜欢
  • 2020-03-03
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多