对于我的 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/