Проверка, существует ли пользователь в Firebase, не работает - Swift - PullRequest
0 голосов
/ 11 февраля 2020

Я использую Firebase в своем проекте Swift / iOS и пытаюсь реализовать проверку, чтобы определить, существует ли уже пользователь в базе данных, когда он входит в поток входа в систему / входа в систему.

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

if let user = Auth.auth().currentUser {
    let ref = self.ref.child("users").child(user.uid)
    ref.observeSingleEvent(of: .value, with: { snapshot in
        self.performSegue(withIdentifier: "GoToMainViewController", sender: nil)
     })

} else {
    self.performSegue(withIdentifier: "GoToProfileCreationViewController", sender: nil)
}

Я пробовал принять в этих двух SO потоках здесь и здесь , но последовательно получаю один и тот же результат.

РЕДАКТИРОВАТЬ: Это моя структура базы данных

enter image description here

EDIT2: Это полный поток, включая код, в котором я аутентифицировал подписанный у пользователя (по номеру телефона). В обоих местах, где я регистрирую идентификатор пользователя, я получаю идентификатор входа в систему.

Auth.auth().signIn(with: credential) { (authResult, error) in
    if let error = error {
        let alert = UIAlertController(title: nil, message: error.localizedDescription, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) { actions in
        })
        self.present(alert, animated: true)
        return
    }

    let userID = Auth.auth().currentUser?.uid

    print(userID)

    Auth.auth().addStateDidChangeListener { auth, user in
        if user != nil{
            print("user is not nil")
            //self.performSegue(withIdentifier: "GoToJoinChannelsViewController", sender: self)
        }
        else{
            print("user is nil")
            //self.performSegue(withIdentifier: "GoToProfileCreationViewController", sender: nil)
        }
    }

    print(userID)

    //Check if user exists
    if let user = Auth.auth().currentUser {
        let ref = self.ref.child("users").child(user.uid)
        ref.observeSingleEvent(of: .value, with: { snapshot in
            print(snapshot)
            //self.performSegue(withIdentifier: "GoToJoinChannelsViewController", sender: nil)
        })

    } else {
        //self.performSegue(withIdentifier: "GoToProfileCreationViewController", sender: nil)
    }

Вот так выглядит результирующий снимок:

Snap (sxQLr6p9meZyQi8p8RPrjVxcUi33) {
    bio = h;
    birthday = "11-Feb-1989";
    firstname = n;
    lastname = n;
}

1 Ответ

1 голос
/ 11 февраля 2020

Вы захотите подключить прослушиватель базы данных внутри измененного слушателя состояния авторизации, чтобы он работал только после аутентификации пользователя:

Auth.auth().addStateDidChangeListener { auth, user in
  if user != nil {
    let ref = self.ref.child("users").child(user.uid)
    ref.observeSingleEvent(of: .value, with: { snapshot in
      if snapshot.exists() {
        // TODO: a user is signed in and registered, navigate to the next screen for them
        self.performSegue(withIdentifier: "GoToJoinChannelsViewController", sender: nil)
      }
      else {           
        // TODO: a user is signed in and not registered, navigate to the next screen for them
      }
    })
  }
  else{
    self.performSegue(withIdentifier: "GoToProfileCreationViewController", sender: nil)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...