我正在尝试为使用 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/