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
相关产品推荐
相关产品推荐

