You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS集成Firebase Auth后未登录状态不跳转登录页如何解决

问题解决方法

核心原因

  • 跳转调用时机错误:viewDidLoad 阶段控制器视图仅完成加载,还未被添加到当前应用的可视视图层级中,此时调用performSegue系统不会响应跳转逻辑。
  • Firebase 认证状态判断不准:应用刚启动时Firebase Auth需要异步同步本地认证状态,直接读取Auth.auth().currentUser可能拿到未初始化完成的错误值。
  • 可选排查:确认Storyboard里对应segue的标识符严格等于notlogin,大小写完全匹配。

修复方案

把跳转逻辑从viewDidLoad中移除,更稳妥的方式是改用Firebase Auth的状态监听器执行判断,修改后代码如下:

import UIKit
import Firebase
import FirebaseAuth
import FirebaseFirestore

class HomeViewController: UIViewController {
    @IBOutlet weak var ExerciseBtn: UIButton!
    @IBOutlet weak var ExerciseData: UIButton!
    @IBOutlet weak var shopbtn: UIButton!
    @IBOutlet weak var leaderboardbtn: UIButton!
    @IBOutlet weak var profilebtn: UIButton!
    
    // 声明认证状态监听的句柄,用于页面销毁时移除监听避免内存泄漏
    private var authStateListener: AuthStateDidChangeListenerHandle?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        ExerciseBtn.layer.cornerRadius = 10
        ExerciseData.layer.cornerRadius = 10
        shopbtn.layer.cornerRadius = 10
        leaderboardbtn.layer.cornerRadius = 10
        profilebtn.layer.cornerRadius = 10
        ExerciseData.setBackgroundImage(UIImage(named: "data"), for: UIControl.State.normal)
        shopbtn.setBackgroundImage(UIImage(named: "shop"), for: UIControl.State.normal)
        leaderboardbtn.setBackgroundImage(UIImage(named: "leaderboard"), for: UIControl.State.normal)
        profilebtn.setBackgroundImage(UIImage(named: "profile"), for: UIControl.State.normal)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // 添加认证状态监听,Firebase完成状态同步后会自动触发回调
        authStateListener = Auth.auth().addStateDidChangeListener { [weak self] auth, user in
            guard let self = self else { return }
            if user == nil {
                self.performSegue(withIdentifier: "notlogin", sender: self)
            }
        }
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // 页面离开时移除监听
        if let listener = authStateListener {
            Auth.auth().removeStateDidChangeListener(listener)
        }
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

如果只需要页面首次出现时判断一次登录状态,也可以简化为直接把跳转逻辑移到viewDidAppear中:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if Auth.auth().currentUser == nil {
        self.performSegue(withIdentifier: "notlogin", sender: self)
    }
}

内容的提问来源于stack exchange,提问作者Kiran Lim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:42:02