ios - 应用程序委托(delegate)或初始 View Controller ,检查用户是否通过 Firebase 登录 iOS 应用程序?

标签 ios firebase firebase-authentication

对于我的 iOS 应用程序,我目前正在使用 Firebase 文档中推荐的方法,在我的初始 View Controller 中检查用户是否通过 Firebase 使用电子邮件和密码登录。如果用户未登录,我将显示登录屏幕,如下所示:

class InitialViewController: UIViewController {

    var authHandle: FIRAuthStateDidChangeListenerHandle!

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        hasUserSignedIn()
    }

    func hasUserSignedIn() {

        authHandle = FIRAuth.auth()?.addStateDidChangeListener { [unowned self] auth, user in

        if user == nil {
            self.perform(#selector(self.presentLogInSignUp), with: nil, afterDelay: 0)
        } 
    }

}

但是,当用户未登录时,他们会在登录 Controller 出现之前短暂地看到我的初始 View Controller ,这并不是很好的用户体验。解决此问题的一种方法是在应用程序委托(delegate)的 didFinishLaunchingWithOptions 中添加检查。

首先,应用委托(delegate)和 didFinishLaunchingWithOptions 是否适合检查用户是否使用 Firebase 登录(将在 FIRAppConfigure() 之后完成)?据我了解,我认为用户的 Firebase 登录状态保留在钥匙串(keychain)中(正确吗?)

其次,如果应用程序委托(delegate)是检查用户登录状态的适当位置,我应该像在初始 View Controller 中那样使用推荐的方法还是下面的方法?后者的优点是我不需要担心必须删除监听器,但 Firebase 文档使用此方法发出警告,表明身份验证对象可能尚未完成初始化。

    if FIRAuth.auth()?.currentUser != nil {
        // User is signed in.
        // ...
    } else {
        // No user is signed in.
        // ...
    }

当前潜在的解决方案: 我在 didFinishLaunchingWithOptions 中使用推荐的方法,并且在 didFinishLaunchingWithOptions 中使用后删除处理程序。

Firebase 非常棒,期待正确实现。

最佳答案

they briefly see my initial view controller

他们没有看到初始 View Controller 。他们看到的是初始 View Controller 正在控制的 View 。即,当代码到达 viewWillAppear 时, View 已经加载并准备好显示,这就是为什么它在更改为登录 View 之前最初是可见的。

确定应显示哪个 View 的逻辑应在此之前发生。

一种选择是在应用程序委托(delegate)中确定这一点,并在 didFinishLaunchingWithOptions 函数的代码中实例化适当的 viewController。

如果您查看 Main.storyboard,单击 View ,然后在属性检查器的右侧,有一个“Is Initial View Controller”复选框。这是第一个显示的。如果取消选中该选项,则可以在代码中进行设置。

查看此问题和答案

Programmatically set the initial view controller using Storyboards

关于ios - 应用程序委托(delegate)或初始 View Controller ,检查用户是否通过 Firebase 登录 iOS 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41038000/

相关文章:

ios - Xcode 6 : Build hangs and Interface Builder Cocoa Touch Tool starts allocating all RAM

iphone - 奇怪的崩溃并显示消息 "Attempted to dereference garbage pointer"

firebase - 方法 'document' 没有为类型 'CollectionReference' 定义。 flutter/火力基地

android - 在MVVM Android中使用Firebase注销的正确方法

c# - Firebase .NET token 验证

ios - 滑动删除作品,但删除按钮没有

ios - 如何用按钮操作替换 self.navigationItem.leftBarButtonItem = self.editButtonItem() }

android - Admob 横幅广告未在 Android 中加载

java - 错误 : 'Please fix the version conflict either by updating the version....'

swift - Firebase身份验证: linking multiple accounts in Swift