首页 > 解决方案 > 尝试使用 addStateDidChangeListener() 保持用户登录时遇到问题

问题描述

所以我现在的目标是成功地让用户保持登录状态,并根据他们是否登录显示某个 viewController。我已经阅读了很多关于同一主题的 Google 搜索首先出现的 Stack 问题,他们说使用addStateDidChangeListener(),这正是我所做的。

我不知道如何解决这个问题,所以我看了一个 Youtube 视频并复制了那个人的确切代码,他的项目做了我想让我做的事情,所以我试了一下。不幸的是,当我运行模拟器、登录、退出模拟器并再次模拟时,没有任何变化。我将添加我的代码及其位置。

这是我AppDelegate.swiftdidFinishLaunchingWithOptions方法中的代码

let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
     let auth = Auth.auth()
    
    
    auth.addStateDidChangeListener { (_, user) in
        switch user {
        case nil:
            guard self.activeViewController! is StudentSegmentedTableViewController else { return }
            let nonLoggedInViewController = storyboard.instantiateViewController(withIdentifier: Constants.StoryboardIDs.GothereMainMenuStoryboardID) as! GothereMainMenuViewController
            self.navigationController.setViewControllers([nonLoggedInViewController], animated: false)
            self.navigationController.popToViewController(nonLoggedInViewController, animated: true)
            self.activeViewController = nonLoggedInViewController
            
        default:
            guard self.activeViewController! is GothereMainMenuViewController else { return }
            let alreadyLoggedInViewController = storyboard.instantiateViewController(withIdentifier: Constants.StoryboardIDs.StudentEventDashboardStoryboardID) as! StudentSegmentedTableViewController
            self.navigationController.setViewControllers([alreadyLoggedInViewController], animated: false)
            self.navigationController.popToViewController(alreadyLoggedInViewController, animated: true)
            self.activeViewController = alreadyLoggedInViewController
        }
    }
    
    let nonLoggedInViewController = storyboard.instantiateViewController(withIdentifier: Constants.StoryboardIDs.GothereMainMenuStoryboardID) as! GothereMainMenuViewController
    let alreadyLoggedInViewController = storyboard.instantiateViewController(withIdentifier: Constants.StoryboardIDs.StudentEventDashboardStoryboardID) as! StudentSegmentedTableViewController
    
    activeViewController = nonLoggedInViewController
    
    switch Auth.auth().currentUser != nil {
    case true:
        activeViewController = alreadyLoggedInViewController
    default:
        break
    }
    
    navigationController = UINavigationController.init(rootViewController: activeViewController)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

起初我只是单独尝试过,但它没有用,所以我在我的应用程序的合理位置实现了一个状态监听器。

首先,我添加了一个在成功登录/注册并执行 segue 后立即启用的功能。

func enableAuth() {
   authListener = Auth.auth().addStateDidChangeListener { (_, user) in
        print("State Listener activated")
    }
}

这就是我viewDidLoad()在登录/注册后立即在 segued viewController 中调用的内容。要删除它,我只需在按下注销按钮时调用它..

func disableAuthState() {
    Auth.auth().removeStateDidChangeListener(self.authListener!)
    print("State Listener Deactivated")

}

func studentLogoutSelected() {
    var text = UITextField()
    
    let alert = UIAlertController(title: "Logout", message: "Are you sure you want to logout?", preferredStyle: .alert)
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (action) in
        self.dismiss(animated: true, completion: nil)
    }
    let logoutAction = UIAlertAction(title: "Logout", style: .default) { (logoutAction) in
        let firebaseAuth = Auth.auth()
        
        do {
            try firebaseAuth.signOut()
            self.disableAuthState()
            self.performSegue(withIdentifier: Constants.Segues.studentLogout, sender: self)
        } catch let signOutError as NSError {
            print("There was an error signing the user out. \(signOutError)")
        }
    }
    alert.addAction(cancelAction)
    alert.addAction(logoutAction)
    present(alert, animated: true, completion: nil)
}

在所有这些功能和实现之后,显示的代码块仍然没有按照我的预期去做。如果有人能指出问题或建议,那就太好了,谢谢。

标签: swiftgoogle-cloud-firestorefirebase-authenticationlistenerappdelegate

解决方案


首先,您是否在 appdelegate 中的 didFinishLaunchingWithOptions 函数中添加 FirebaseApp.configure()?然后,您可以尝试在 viewWillAppear() 中调用 enableAuth


推荐阅读