swift - 尝试使用 addStateDidChangeListener() 保持用户登录时遇到问题
问题描述
所以我现在的目标是成功地让用户保持登录状态,并根据他们是否登录显示某个 viewController。我已经阅读了很多关于同一主题的 Google 搜索首先出现的 Stack 问题,他们说使用addStateDidChangeListener()
,这正是我所做的。
我不知道如何解决这个问题,所以我看了一个 Youtube 视频并复制了那个人的确切代码,他的项目做了我想让我做的事情,所以我试了一下。不幸的是,当我运行模拟器、登录、退出模拟器并再次模拟时,没有任何变化。我将添加我的代码及其位置。
这是我AppDelegate.swift
在didFinishLaunchingWithOptions
方法中的代码
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)
}
在所有这些功能和实现之后,显示的代码块仍然没有按照我的预期去做。如果有人能指出问题或建议,那就太好了,谢谢。
解决方案
首先,您是否在 appdelegate 中的 didFinishLaunchingWithOptions 函数中添加 FirebaseApp.configure()?然后,您可以尝试在 viewWillAppear() 中调用 enableAuth
推荐阅读
- javascript - 用于获取访问令牌(OAuth 2.0)的无效客户端密码输入导致主页(C#)
- javascript - 脚本类型模块在注入 iframe 时不起作用
- javascript - 尝试执行随机命令而无需重新启动机器人
- angular - 如何有条件地更改 Angular 中垫子单元格的背景颜色?
- elasticsearch - 需要写 DSL 来检查这 4 个事件在 Elasticsearch 中是否发生在 1 秒内
- python - 提供 s3.upload_file() 的 url
- kubernetes - Kubernetes:无法将 int64 转换为字符串。Kubernetes 无法解释 helmchart values.yaml 文件中的整数值
- firebase - 将 Cron 作业设置为放大
- javascript - 计算按钮问题,html和javascript
- java - Apache Camel 中的类型转换器问题