首页 > 解决方案 > 如何解决随处开放的 Firebase 监听器的问题?

问题描述

我有一些简单的应用程序,它有身份验证。最近的代码检查您是否已经输入:

 func signingManager(){
    Auth.auth().addStateDidChangeListener { [weak self] (auth, user) in
        guard let self = self else {return}
        if user != nil {
            self.showNextVC()
            print("You are already entered")
        }
    }
}

它在您第一次打开应用程序时有效,如果您输入 func "showNextVC" 将打开下一个 VC。同时我有带有代码的登录按钮:

    @IBAction func logInTapped(_ sender: UIButton) {
    guard let email = emailTextField.text, let password = passwordTextField.text, email != "", password != "" else {
        displayWarningLabel(withText: "info is incorrect")
        return
    }
    Auth.auth().signIn(withEmail: email, password: password, completion: { [weak self] (user, error) in
        if error != nil {
            self?.displayWarningLabel(withText: "error occured")
            return
        }
        if user != nil {
            self?.showNextVC()
            print("Congratulations, you have successfully logged in!")
        }
        self?.displayWarningLabel(withText: "no such user")
    }
)}

现在关于问题:如果我单击“登录”按钮,首先触发“signingManager ()”方法和它的“showNextVC”,然后才触发“logInTapped”方法本身,然后再次触发“showNextVC”。结果我有2个VC和两条消息:“你已经进入”和“恭喜你成功登录!” 我究竟做错了什么?谢谢!

标签: iosswiftfirebase-authentication

解决方案


由于您正在侦听身份验证状态更改,因此您不需要self?.showNextVC()在完成回调中处理signIn(withEmail:, password:). 该代码应该只出现在addStateDidChangeListener.

或者,您可以:

  1. 使用addStateDidChangeListener初始检测用户是否已登录。
  2. 在状态更改的回调中:
    1. 通过调用删除监听器removeAuthStateDidChangeListener
    2. 启动显式登录流程,并signIn(withEmail:, password:)像现在一样调用。

推荐阅读