web-dev-qa-db-fra.com

La déconnexion de Firebase ne fonctionne pas dans Swift

J'utilise la dernière API Firebase (3.2.1) et j'utilise ce code pour vérifier si l'utilisateur est connecté:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    if(self.navigationController != nil){
        self.navigationController!.setNavigationBarHidden(true, animated: true)
    }

    if(FIRAuth.auth() != nil){
        self.performSegueWithIdentifier("loginSuccessSegue", sender: self)
    }
}

En d'autres termes, si un objet auth est présent, je passe à un autre contrôleur. Sur ce contrôleur, j'ai un bouton de déconnexion qui se déconnecte comme ceci:

do{
    try FIRAuth.auth()?.signOut()
    self.performSegueWithIdentifier("logoutSegue", sender: self)
}catch{
    print("Error while signing out!")
}

Je n'obtiens pas d'erreur sur cette opération mais lorsque je suis passé au contrôleur de connexion, cet objet d'authentification est présent et je suis de nouveau basculé sur le contrôleur avec des données. J'ai également essayé de vérifier l'objet utilisateur actuel en auth et il est présent et valide.

Quelqu'un sait comment je me déconnecte correctement?

13
Dejan

essayez d'utiliser:

try! FIRAuth.auth()!.signOut()

Voici le code que j'ai dans une IBAction, et ça marche très bien:

try! FIRAuth.auth()!.signOut()     
if let storyboard = self.storyboard {
    let vc = storyboard.instantiateViewControllerWithIdentifier("firstNavigationController") as! UINavigationController
        self.presentViewController(vc, animated: false, completion: nil)
    }

Swift 4.2 Update #

try! Auth.auth().signOut()

if let storyboard = self.storyboard {
            let vc = storyboard.instantiateViewController(withIdentifier: "firstNavigationController") as! UINavigationController
            self.present(vc, animated: false, completion: nil)
        }
35
Damien Bannerot

Je voudrais juste ajouter que j'ai eu le même problème et que j'ai essayé différentes combinaisons du code que d'autres ont suggérées.

Le problème pour moi s'est avéré que lorsque j'ai configuré mon bouton de déconnexion dans le storyboard, j'ai également créé une connexion en faisant glisser le bouton du bouton vers mon contrôleur de vue de connexion, pensant que c'était ce que je voulais qu'il fasse.

Il s'est avéré que mon code de déconnexion n'a jamais été exécuté à cause de la séquence déclenchée pour revenir au contrôleur de connexion, il est donc retourné à l'écran de connexion et immédiatement à mon deuxième contrôleur de vue car l'utilisateur n'a jamais été déconnecté.

Donc à la fin, cela a fonctionné pour moi:

do {
    try Auth.auth().signOut()
    self.dismiss(animated: true, completion: nil)
    } catch let err {
        print(err)
}

Mais seulement après J'ai supprimé la séquence que j'avais involontairement créée.

6
Adam Webb