如何在ios中使用firebase登录来维护登录页面和主页的正确顺序?

时间:2018-05-03 15:25:42

标签: ios swift firebase-authentication

这听起来很基本。但我无法找到出路。

如果必须事先知道,请使用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

乍一看,这几乎是我需要完成的事情:

Signup-Login-Home-Sequence

  

即使没有代码示例也是如此。

3 个答案:

答案 0 :(得分:0)

尝试检查loadView()函数,或者您可以创建一个带有启动画面等背景图像的入口视图控制器,将其作为初始视图并在viewWillAppear中设置您的检查功能

答案 1 :(得分:0)

我遇到了类似的困境,并通过添加'Splash'ViewController作为应用程序的入口控制器来解决它。我的样式与LaunchScreen.storyboard相同。在SplashVC我检查有效的用户令牌,如果存在,它将直接发送到主应用程序(在我的情况下,这是TabBarController)。在我的TabBarController我设置了一个Firebase addStateDidChangeListener,如果用户令牌变为无效,它将直接返回到LoginVC。

我还使用Splash VC运行异步代码来检查订阅状态,并将登录详细信息写入Firebase

请原谅快速而肮脏的原理图。

enter image description here

答案 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