3 votes

Obtenir la valeur de l'utilisateur actuel à partir de Firebase Firestore - Swift 4

C'est ma première question ici, j'espère que vous pourrez m'aider.

J'ai essayé d'obtenir un chemin spécifique pour l'utilisateur actuel connecté à mon application.

Je ne sais pas vraiment ce que je fais de mal, alors je vais coller mon code ici.

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
   }
  }
 }
}

C'est ma fonction pour créer un utilisateur.

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()
            ])
    }

Et voici mon action de connexion :

@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()

        }

    }

Et voici une image de ma base de données :

Image de la base de données

2voto

Sean Stayn Points 1238

Si vous créez un utilisateur avec Firebase Authentication, l'authentification créera un utilisateur et un identifiant pour vous dans Firebase Auth (pas Firestore).

Ainsi, lorsque vous créez votre utilisateur dans Firestore, vous devez définir l'userID comme identifiant du document, comme ci-dessous :

@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()

    }

}

et

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()
        ])
}

1voto

OkiRules Points 384

Vous devriez obtenir l'identifiant de l'utilisateur actuel, essayez ceci :

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
   }
  }
 }
}

Cela permet d'obtenir l'utilisateur actuel connecté à l'application, puis d'utiliser l'identifiant de l'utilisateur pour rechercher dans la base de données. Assurez-vous simplement que lorsque vous créez un compte, vous enregistrez les données de l'utilisateur en conséquence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X