从Firebase Firestore-Swift 4获取当前用户的值

从Firebase Firestore-Swift 4获取当前用户的值,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,这是我在这里的第一个问题,希望你能帮助我 我一直在尝试获取当前登录到我的应用程序的用户的特定路径 我现在真的不知道我做错了什么,所以我将把我的代码粘贴到这里 func userRoleListener(){ guard let user=Auth.Auth().currentUser else{return}。 Firestore.Firestore().collection(“users”).document(“sjbD5SvKTYHWBLhCqojs”).getDocument{(快照,错误

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

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

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

func userRoleListener(){
guard let user=Auth.Auth().currentUser else{return}。
Firestore.Firestore().collection(“users”).document(“sjbD5SvKTYHWBLhCqojs”).getDocument{(快照,错误)位于
如果let data=snapshot?.data(){
guard让isAdmin=data[“isAdmin”]作为Bool else{return}
如果是艾德明{
self.applyButton.ishiden=true
}否则{
self.applyButton.ishiden=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()

        }

    }
这是我数据库的图像:


您应该从当前用户获取用户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
   }
  }
 }
}

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

如果您使用Firebase身份验证创建用户,身份验证将在Firebase Auth(非Firestore)中为您创建用户和用户id

因此,在Firestore中创建用户时,必须将用户id设置为文档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()

    }

}
@IBAction func signUpButtonPressed(uu-sender:Any){
guard let email=emailTextField.text,let password=passwordTextField.text,!email.isEmpty,!password.isEmpty else{return}
self.signUpButton.animateButton(shouldLoad:true,带消息:“”)
Auth.Auth().createUser(带电子邮件:电子邮件,密码:密码){(用户,错误)在
如果let error=error{
self.signUpButton.animateButton(shoulload:false,带有消息:“register!”)
debugPrint(错误。本地化描述)
simplelert(标题:“Error”,消息:“Error al-iniciar sesión,intent nuevamente en unos minutos”)
返回
}
self.signUpButton.animateButton(shouldLoad:false,带消息:“”)

self.createUser(user.uid)//运行此代码时出现了什么问题?我遇到的问题是当我尝试以下操作时:Firestore.Firestore.collection(“users”).document(user.uid).getDocument()我没有收到任何当前用户,但当我直接手动插入当前用户id(“sjbd5svktywhblhcqojs”)时,按钮是隐藏的,还可以从Firestore获取数据。我以前尝试过这个,但我也遇到了同样的问题,它不起作用。请在用户注册时更新您的代码,也许还可以更新您的数据库照片?是的,使用上面的答案,您可以通过我的答案获取当前用户信息。希望您发现代码易于阅读而且可以理解。这一个有效,我不知道我必须在创建操作上传递用户ID。非常感谢。
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()
        ])
}