web-dev-qa-db-fra.com

Vérification de l'utilisateur connecté de Firebase via Listener dans iOS

J'ai implémenté l'autorisation Firebase pour me connecter à mon application iOS via Facebook et Google. Je code Swift. Lorsque l'application démarre, je dois vérifier si un utilisateur est déjà connecté afin de présenter le ViewController approprié (par exemple, si personne n'est connecté, je présente le Login View Controller, sinon je présente le Home View Controller). Si j'utilise la solution "facile" proposée par Firebase, ce qui signifie

if FIRAuth.auth()?.currentUser != nil {
  // User is signed in.
  // ...
} else {
  // No user is signed in.
  // ...
}

Ainsi, si l'utilisateur actuel n'est pas nul, cela se produit exactement comme le guide Firebase ( https://firebase.google.com/docs/auth/ios/manage-users ) des alertes peuvent se produire, ce qui signifie

"Remarque: currentUser peut également être nul car l'objet auth n'a pas terminé son initialisation. Si vous utilisez un écouteur pour suivre l'état de connexion de l'utilisateur, vous n'avez pas besoin de gérer ce cas."

Je voudrais donc implémenter l'écouteur comme suggéré dans le guide:

handle = FIRAuth.auth()?.addStateDidChangeListener() { (auth, user) in
  // ...
}

L'écouteur gérera également l'état intermédiaire afin qu'il soit déclenché lors de la création de l'objet Auth. Le fait est que je ne peux vraiment pas le faire fonctionner correctement. Quelqu'un peut-il m'aider à utiliser cet écouteur afin de vérifier si un utilisateur est connecté?

Merci

11
Freddie Mash

Je l'ai implémenté comme ceci:

FIRAuth.auth()?.addStateDidChangeListener { auth, user in
  if let user = user {
    // User is signed in. Show home screen
  } else {
    // No User is signed in. Show user the login screen
  }
}

Si vous n'avez pas besoin de l'objet Utilisateur après vérification, vous pouvez remplacer if let user = user avec un test booléen, comme ceci:

FIRAuth.auth()?.addStateDidChangeListener { auth, user in
  if user != nil {
    // User is signed in. Show home screen
  } else {
    // No User is signed in. Show user the login screen
  }
}

Où mettre l'auditeur (à partir des commentaires):

Pour les cas où je vérifiais si un utilisateur était connecté, il suffisait de le placer au début de viewDidLoad dans le contrôleur de vue spécifique. Mais si vous avez des cas où vous devez vérifier chaque fois que vous entrez dans le contrôleur de vue spécifique, il serait préférable de le placer au début de viewDidAppear. Mais je pense que dans la plupart des cas, vous devez vérifier une seule fois, si l'utilisateur entre dans la vue

12
ronatory

Si vous configurez le StateDidChangeListener dans application:didFinishLaunchingWithOptions, vous remarquerez qu'il se déclenche une fois lorsque l'écouteur est attaché (pour définir l'état initial, qui est nil lors de l'initialisation), puis à nouveau une fois l'initialisation terminée (potentiellement pas nil ). Il s'agit d'un comportement prévu, mais très peu pratique si vous le configurez tôt.

Une alternative à l'utilisation de l'écouteur est d'utiliser NotificationCenter. Cela se déclenchera une fois l'initialisation terminée:

NotificationCenter.default.addObserver(forName: NSNotification.Name.AuthStateDidChange, object: Auth.auth(), queue: nil) { _ in
    let user = Auth.auth().currentUser
}
3
Thomas Verbeek