自动登录用户-Swift Firebase

自动登录用户-Swift Firebase,swift,firebase,firebase-authentication,swift5,Swift,Firebase,Firebase Authentication,Swift5,我有一个有两个viewController的应用程序,第一个用于登录,第二个是tableViewController,它是应用程序的主viewController。我试图在关闭应用程序并导航到主viewController后自动保持用户登录。我尝试了这段代码,它来自firebase文档,但当我启动应用程序时,它显示了致命错误:在展开可选值时意外发现nil 这是我的AppDelegate代码: class AppDelegate: UIResponder, UIApplicationDelegat

我有一个有两个viewController的应用程序,第一个用于登录,第二个是tableViewController,它是应用程序的主viewController。我试图在关闭应用程序并导航到主viewController后自动保持用户登录。我尝试了这段代码,它来自firebase文档,但当我启动应用程序时,它显示了致命错误:在展开可选值时意外发现nil

这是我的AppDelegate代码:

class AppDelegate: UIResponder, UIApplicationDelegate {
var db: Firestore!
var firebaseToken: String = ""
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
    
    FirebaseApp.configure()
    
    self.registerForFirebaseNotification(application: application)
    Messaging.messaging().delegate = self
    
    

    handle = Auth.auth().addStateDidChangeListener { (auth, user) in
        if user != nil {
         
            
            let main = UIStoryboard(name: "Main", bundle: nil)
                   let vc = main.instantiateViewController(identifier: "viewController") as! ViewController
                   self.window?.rootViewController = vc
                   window?.makeKeyAndVisible()
            
        } else {
            // ...
        }
    }



    return true
    
}
    
您可以尝试以下方法:

        if Auth.auth().currentUser != nil {
            // Logged
            let main = UIStoryboard(name: "Main", bundle: nil)
            let vc = main.instantiateViewController(identifier: "ViewController") as! ViewController
            self.window?.rootViewController = vc
            window?.makeKeyAndVisible()
           
        }else{
            //Not logged

        }

Firebase身份验证在用户登录时自动将用户凭据存储到磁盘。重新启动应用程序时,Firebase会自动从这些凭据恢复用户的状态。但是这个过程需要调用服务器(例如,检查帐户是否已被禁用),这意味着当您的
Auth.Auth().currentUser!=nil
运行该调用,该调用可能尚未完成,当前用户为nil

解决方案是使用身份验证状态侦听器,如上的文档中的第一个代码段所示


我试过了,但在登录并重新启动应用程序后,它没有导航到主viewController并显示登录viewControllerWelcome Fetih Tuny,谢谢分享您的问题。请不要在问题中仅将代码作为文本。添加问题的描述。请阅读以了解如何编写好的问题。当您首次登录时,您必须将
凭证
保存到
UserDefaults
中,并且当应用程序关闭并重新启动时,您可以使用该凭证来
签名并使用保存的凭证检索数据,如果有数据,则将用户带到主屏幕,或者带到登录屏幕。因此,在这种情况下,让我们删除
句柄。我更新了答案中的代码。如果你在
if user!=nil{
并在调试器中运行,它是否命中该断点?如果是,则
用户
的值是多少?如果现在让它运行,它是否再次命中断点?如果是,则
用户
的值是多少?嘿@sar71。您在这方面取得了更多进展吗?
Auth.auth().addStateDidChangeListener { (auth, user) in
    if user != nil {
        // ...
    } else {
        // ...
    }
}