Получить значение для текущего пользователя из Firebase Firestore — Swift 4

#swift #firebase #google-cloud-firestore

#swift #firebase #google-облако-firestore

Вопрос:

это мой первый вопрос здесь, я надеюсь, вы сможете мне помочь.

Я пытался получить конкретный путь для текущего пользователя, вошедшего в мое приложение.

Я действительно не понимаю, что я делаю неправильно, поэтому я вставлю свой код сюда.

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

        }

    }
  

И это изображение моей базы данных:

Изображение базы данных

Комментарии:

1. Что происходит не так при запуске этого кода?

2. Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь это сделать: Firestore.firestore.collection («пользователи»).document (user.uid).getDocument() Я не получаю ни одного текущего пользователя, но когда я иду прямо вперед и вставляю вручную текущий идентификатор пользователя («sjbD5SvKTYHWBLhCqojs»), кнопка скрыта, а также получаю данные из Firestore.

Ответ №1:

Если вы создаете пользователя с аутентификацией Firebase, аутентификация создаст пользователя и идентификатор пользователя для вас в Firebase Auth (не Firestore)

Итак, когда вы создаете своего пользователя в Firestore, вы должны установить идентификатор пользователя в качестве идентификатора документа, как показано ниже:

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

Комментарии:

1. Это сработало, я не знал, что мне нужно передать идентификатор пользователя в действии create. Большое спасибо.

Ответ №2:

Вы должны получить идентификатор пользователя от текущего пользователя, попробуйте это:

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

Получаем текущего пользователя, вошедшего в приложение, а затем использующего пользовательский идентификатор для поиска в базе данных. Просто убедитесь, что при создании учетной записи вы соответствующим образом сохранили данные пользователя.

Комментарии:

1. Я пробовал это раньше, и у меня такая же проблема, это не сработало.

2. Не могли бы вы, пожалуйста, обновить свой код, добавив при регистрации пользователя фотографию вашей базы данных?

3. Да, и используя приведенный выше ответ, вы можете получить информацию о текущем пользователе с моим ответом. Надеюсь, вы нашли код простым для чтения и понятным.