2017-07-24 1 views
1

J'ai une application qui est connectée à Firebase et vous pouvez vous connecter en utilisant Google et Facebook. L'application dispose d'un écran d'accueil qui est chargé lorsque l'utilisateur est connecté. Je ne souhaite pas afficher l'écran de connexion si l'utilisateur s'est déjà connecté auparavant. Donc j'utilise ce code dans l'écran d'accueil pour vérifier si l'utilisateur est connecté. Écran d'accueil est le contrôleur de vue initial dans l'applicationSwift - Ce code est-il incorrect ou dois-je utiliser UserDefaults?

override func viewDidAppear(_ animated: Bool) { 
    if Auth.auth().currentUser != nil{ 
     // user is signed in 
    }else{ 
     // No user is signed in. 
     performSegue(withIdentifier: "login", sender: nil) 
    } 
} 

Ce code fonctionne très bien. Je sais, que je pourrais utiliser UserDefaults aussi, mais cela semble être un moyen plus facile. Est-ce mal ou devrais-je utiliser UserDefaults? Mais le seul problème est que, pendant un instant, l'écran d'accueil est affiché, puis le segue est effectué sur l'écran de connexion, et je suppose que c'est parce qu'il est dans la méthode viewdidApepar, donc le code est exécuté après le viewcontroller est apparu. Connaissez-vous une solution?

+0

Je suis sûr que Firebase utilise UserDefaults ou CoreData en dessous de cette API. J'utilise la même manière, je n'ai jamais eu de problèmes. –

+0

Oui mais le seul problème est que l'écran d'accueil est affiché pendant un court instant puis le segue est exécuté sur l'écran de connexion, et je suppose que c'est dans la méthode viewdidApepar, le code est exécuté après l'affichage du viewcontroller. Connaissez-vous une solution? –

+1

L'utilisation de 'viewWillAppear' pourrait à la place fonctionner –

Répondre

1

C'est ce que je fais personnellement, didFinishLaunchingWithOptions dans AppDelegate.

if UserManager.sharedManager.currentUser != nil { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) 
     let viewController = storyboard.instantiateInitialViewController() 
     appDelegate.window?.rootViewController = viewController 
    } else { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let storyboard = UIStoryboard(name: "Login", bundle: Bundle.main) 
     let viewController = storyboard.instantiateInitialViewController() 
     appDelegate.window?.rootViewController = viewController 
    } 

Bien sûr, j'ai un UserManager qui gère si l'utilisateur est connecté ou non. (UserManager: NSObject)

var currentUser: User? { 
    return User.unarchiveStoredUser() 
} 

utilisateur est stocké avec décodeur dans UserDefautls puis désarchivés pour vérifier si un utilisateur est connecté ou non (Utilisateur: NSObject)

func archiveUser() { 
    let data = NSKeyedArchiver.archivedData(withRootObject: self) 
    UserDefaults.standard.set(data, forKey: "userIdentifier") 
    UserDefaults.standard.synchronize() 
} 

class func unarchiveStoredUser() -> User? { 
    if let data = UserDefaults.standard.object(forKey: "userIdentifier") as? Data { 
     let user = NSKeyedUnarchiver.unarchiveObject(with: data) as! User 
     return user 
    } 
    return nil 
} 

Espérons que cela vous aide.

+0

Où devrais-je mettre votre deuxième section de code sur le currentUser? –

+0

En outre, votre troisième section de code est dans une classe appelée UserManager? –

+0

a ajouté les fichiers auxquels ils appartiennent en tant que modification. – Velix007