这听起来很基本。但我无法找到出路。
如果必须事先知道,请使用firebase身份验证。
初始视图控制器设置为LoginViewController
。我在这里有两个按钮: 注册 &的 登录 即可。 注册 按钮以模态方式呈现另一个视图控制器,用户可以选择注册。注册成功后,SignUpViewController
即被解除,因此会显示LoginViewController
。在LoginViewController
viewDidAppear(_:)
内,我会检查当前用户,如果可用,请将用户重定向到HomeViewController
:
class LoginViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let _ = Auth.auth().currentUser {
// This is a modal segue
performSegue(withIdentifier: "SegueToHomeViewController", sender: self)
}
}
}
点击HomeViewController
中的退出按钮时,控制器刚刚退出用户退出。
class HomeViewController: UIViewController {
@IBAction func logoutButtonDidTouch(_ sender: UIBarButtonItem) {
do {
try Auth.auth().signOut()
// This dismiss lands user to the LoginViewController again
// So user has chance to login again with `Login` button this time
dismiss(animated: true, completion: nil)
} catch {
print(error)
}
}
}
到目前为止一切正常。但是有一个 微妙的不当行为 。因为每次启动应用时都会显示LoginViewController
,然后重定向到HomeViewController
,这不如用户体验那么好。
所以,我想要的是,如果用户已经登录,他/她将会看到除HomeViewController
以外的第一个视图LoginViewController
。但如果用户之前没有登录,他/她将登陆LoginViewController
。
是的,我可以通过AppDelegate
application(_:didFinishLaunchingWithOptionss:)
查看当前用户,如果找到,请直接导航到HomeViewController
。但是当用户点击LoginViewController
中的退出时,我会失去HomeViewController
。
乍一看,这几乎是我需要完成的事情:
即使没有代码示例也是如此。
答案 0 :(得分:0)
尝试检查loadView()函数,或者您可以创建一个带有启动画面等背景图像的入口视图控制器,将其作为初始视图并在viewWillAppear中设置您的检查功能
答案 1 :(得分:0)
我遇到了类似的困境,并通过添加'Splash'ViewController
作为应用程序的入口控制器来解决它。我的样式与LaunchScreen.storyboard
相同。在SplashVC
我检查有效的用户令牌,如果存在,它将直接发送到主应用程序(在我的情况下,这是TabBarController
)。在我的TabBarController
我设置了一个Firebase
addStateDidChangeListener
,如果用户令牌变为无效,它将直接返回到LoginVC。
我还使用Splash VC
运行异步代码来检查订阅状态,并将登录详细信息写入Firebase
。
请原谅快速而肮脏的原理图。
答案 2 :(得分:0)
当您注销时没有丢失,您可以轻松地显示任何VC没有segue的任何时间,jsut为每个viewController提供一个标识符并将其设置为UIApplication.shared.keyWindow?.rootViewController
let loginView = self.storyboard?.instantiateViewController(withIdentifier: "loginView") as! loginVC
let nav = UINavigationController(rootViewController: loginView)
nav.navigationBar.isHidden = true
UIApplication.shared.keyWindow?.rootViewController = nav