ios - Firebase Facebook 登录 - 检测用户登录状态并重定向

标签 ios swift firebase firebase-authentication facebook-login

我正在尝试为使用 Facebook 登录 SDK 的应用创建登录页面。当 RootViewController 加载时,它应该确定用户是否已经通过 Facebook 登录,如果是,则将他们定向到应用程序的主页。否则,如果他们尚未通过 Facebook 登录,它应该将他们引导至登录页面进行登录。

我已将代码添加到 RootViewController 以检查 currentUser 是否为 nil,但是无论用户是否通过 Facebook 登录,它似乎都会重定向到主页。

import UIKit
import FirebaseAuth

class RootNavController: UINavigationController {

    var handler: AuthStateDidChangeListenerHandle?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationBar.shadowImage = UIImage()

        // Do any additional setup after loading the view.
    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        handler = Auth.auth().addStateDidChangeListener({ (auth, user) in
            self.checkLoggedInUserStatus()
        })
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        guard let handler = handler else { return }
        Auth.auth().removeStateDidChangeListener(handler)
    }

    fileprivate func checkLoggedInUserStatus() {
        DispatchQueue.main.async {
            if Auth.auth().currentUser == nil {
                let controller = WelcomeController()
                let navController = UINavigationController(rootViewController: controller)
                self.present(navController, animated: true, completion: nil)
                return
            } else {
                self.performSegue(withIdentifier: "UserLoggedIn", sender: nil)
                return
            }
        }

    }

预期结果是仅当用户已经通过 Facebook 登录时才显示主页。

最佳答案

除了快速更改之外,您的代码看起来还不错。只要您在再次打开应用程序之前注销用户,它就应该可以工作。请记住,Fb 登录只为您提供一个 token 以在 firebase 中进行身份验证。之后所有的登录和注销都需要在 Firebase 中处理。我会像这样更改您的代码。但主要是为了简单起见:

 override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        handler = Auth.auth().addStateDidChangeListener({ (auth, user) in
            if user != nil {
                self.performSegue(withIdentifier: "UserLoggedIn", sender: nil)
            } else {
                let controller = WelcomeController()
                let navController = UINavigationController(rootViewController: controller)
                self.present(navController, animated: true, completion: nil)
            }
        })
    }

如果您在 AppDelegate 中执行所有这些操作,也许会更好。这样你就不必在不需要它的情况下呈现 NavBar。相反,您可以在应用启动屏幕之后显示所需的屏幕。

关于ios - Firebase Facebook 登录 - 检测用户登录状态并重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56293622/

相关文章:

ios - 如何正确多线程? UIAlertView不显示,只灰屏

ios - 从模块接口(interface)构建模块失败;它可能已损坏或在生成时触发了 Swift 编译器中的错误

ios - 如何在应用程序中创建 Action 序列(例如 spritekit 游戏)?

json - 如何在 Cloud Functions for Firebase 中使 HTTP 请求异步/等待?

ios - Xcode 4.6.2 : Variable Doesn't Show Up In Outlets

ios - JSON 解析 - 没有 URL session 任务恢复的替代方法是什么,因为它不是主线程的一部分?

ios - viewDidAppear 延迟 0.5 秒

swift - 如何快速处理长整数的答案

node.js - 以循环方式将数据添加到 Cloud Firestore

ios - TableViewController 不显示表格信息