【问题标题】:How to check if user has valid Auth Session Firebase iOS?如何检查用户是否具有有效的身份验证会话 Firebase iOS?
【发布时间】:2026-01-15 08:40:01
【问题描述】:

在展示我的应用的主视图控制器之前,我想检查用户是否仍有有效会话。我使用最新的 Firebase API。我想如果我使用遗产,我就能知道这一点。

这是我到目前为止所做的:

我尝试这样输入 Xcode:

FIRApp().currentUser()
FIRUser().getCurrentUser()

但我似乎找不到那个 getCurrentUser 函数。

【问题讨论】:

  • 等等,什么?有指南吗?我没有注意到“指南”选项卡,只有“参考”选项卡。太感谢了!但是,如果应用只接受 1 个帐户,并且许多用户必须在同一个应用上登录同一个帐户,这是否适用?
  • FIRUser *user = [FIRAuth auth].currentUser;

标签: ios swift firebase


【解决方案1】:
if FIRAuth.auth().currentUser != nil {
   presentHome()
} else {
   //User Not logged in
}

对于更新的 SDK

if Auth.auth().currentUser != nil {

}

【讨论】:

  • 这并不能证明什么。 currentUser 指本地存储的数据
  • 我不知道你想让我说什么,这个答案在这一点上是 3 岁。在 Firebase 示例代码中就是这样使用的??‍♂️
【解决方案2】:

更新答案

最新 Firebase SDK 的解决方案 - DOCS

    // save a ref to the handler
    private var authListener: AuthStateDidChangeListenerHandle?

    // Check for auth status some where
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        authListener = Auth.auth().addStateDidChangeListener { (auth, user) in

            if let user = user {
                // User is signed in
                // let the user in?

                if user.isEmailVerified {
                    // Optional - check if the user verified their email too
                    // let the user in?
                }
            } else {
                // No user
            }
        }
    }

    // Remove the listener once it's no longer needed
    deinit {
        if let listener = authListener {
            Auth.auth().removeStateDidChangeListener(authListener)
        }
    }

原解决方案

Swift 3 中的解决方案

override func viewDidLoad() {
    super.viewDidLoad()

    FIRAuth.auth()!.addStateDidChangeListener() { auth, user in
        if user != nil {
            self.switchStoryboard()
        }
    }
}

switchStoryboard() 在哪里

func switchStoryboard() {
    let storyboard = UIStoryboard(name: "NameOfStoryboard", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "ViewControllerName") as UIViewController

    self.present(controller, animated: true, completion: nil)
}

Source

【讨论】:

  • 该回调为我节省了大量时间,因为我没有收到来自 AuthUI 的任何回调 =/
【解决方案3】:

Swift 4 中的解决方案

override func viewDidLoad() {
    super.viewDidLoad()
    setupLoadingControllerUI()
    checkIfUserIsSignedIn()
}

private func checkIfUserIsSignedIn() {

    Auth.auth().addStateDidChangeListener { (auth, user) in
        if user != nil {
            // user is signed in
            // go to feature controller 
        } else {
             // user is not signed in
             // go to login controller
        }
    }
}

【讨论】:

    【解决方案4】:
    if Auth.auth().currentUser?.uid != nil {
    
       //user is logged in
    
        }else{
         //user is not logged in
        }
    

    【讨论】:

      【解决方案5】:

      虽然您可以查看是否有这样的用户使用Auth.auth().currentUser,但这只会告诉您是否有用户通过了身份验证,无论该用户是否帐户仍然存在或有效。


      完整的解决方案

      真正的解决方案应该是使用Firebase的重新认证:

      open func reauthenticate(with credential: AuthCredential, completion: UserProfileChangeCallback? = nil)
      

      这确保(在启动应用程序时)先前登录/经过身份验证的用户实际上仍然 已经并且可以通过 Firebase 进行身份验证。

      let user = Auth.auth().currentUser    // Get the previously stored current user
      var credential: AuthCredential
          
      user?.reauthenticate(with: credential) { error in
        if let error = error {
          // An error happened.
        } else {
          // User re-authenticated.
        }
      }
      

      【讨论】:

      • 我收到Variable 'credential' used before being initialized
      • 那是因为你在上面的代码中从来没有给credential赋值,你必须先给credential赋值,然后再做user.reauthenticate
      【解决方案6】:
      override func viewDidLoad() {
      FIRAuth.auth()!.addStateDidChangeListener() { auth, user in
                  // 2
                  if user != nil {
                      let vc = self.storyboard?.instantiateViewController(withIdentifier: "Home")
                      self.present(vc!, animated: true, completion: nil)
                  }
              }
      }
      

      来源:https://www.raywenderlich.com/139322/firebase-tutorial-getting-started-2

      【讨论】:

        【解决方案7】:

        Objective-c 解决方案是(iOS 11.4):

        [FIRAuth.auth addAuthStateDidChangeListener:^(FIRAuth * _Nonnull auth, FIRUser * _Nullable user) {
            if (user != nil) {
                // your logic
            }
        }];
        

        【讨论】:

          最近更新 更多