我已经实施了Firebase授权,可以通过Facebook和Google登录我的iOS应用。我正在编写Swift。 当应用程序启动时,我需要检查用户是否已经登录才能呈现正确的ViewController(例如,如果没有人登录,我会提供登录视图控制器,否则我会显示主视图控制器)。 如果我使用Firebase提供的“简单”解决方案,意思是
if FIRAuth.auth()?.currentUser != nil {
// User is signed in.
// ...
} else {
// No user is signed in.
// ...
}
因此,检查当前用户是否为零,它恰好发生Firebase指南(https://firebase.google.com/docs/auth/ios/manage-users)警报可能发生的意义
“注意:currentUser也可能是nil,因为auth对象还没有完成初始化。如果你使用监听器来跟踪用户的登录状态,你不需要处理这种情况。”
所以我想按照指南中的建议实现监听器:
handle = FIRAuth.auth()?.addStateDidChangeListener() { (auth, user) in
// ...
}
侦听器还将处理中间状态,以便在创建Auth对象时触发它。重点是我真的无法让它正常工作。任何人都可以帮我使用这个监听器来检查用户是否已登录?
由于
答案 0 :(得分:12)
我已经实现了这样:
FIRAuth.auth()?.addStateDidChangeListener { auth, user in
if let user = user {
// User is signed in. Show home screen
} else {
// No User is signed in. Show user the login screen
}
}
如果您在检查后不需要User对象,则可以使用布尔测试替换if let user = user
,如下所示:
FIRAuth.auth()?.addStateDidChangeListener { auth, user in
if user != nil {
// User is signed in. Show home screen
} else {
// No User is signed in. Show user the login screen
}
}
将听众放在哪里(来自评论):
对于我过去检查用户是否已登录的情况,将其放在特定视图控制器中viewDidLoad
的开头就足够了。但是,如果您有任何需要在每次进入特定视图控制器时进行检查的情况,那么最好将其放在viewDidAppear
的开头。但我认为在大多数情况下,如果用户进入视图,您只需要检查一次
答案 1 :(得分:1)
如果你在StateDidChangeListener
中设置application:didFinishLaunchingWithOptions
,你会注意到在连接侦听器时会触发一次(设置初始状态,即{{} 1}}初始化时),然后一旦它完成初始化(可能不是nil
)。这是预期的行为,但如果您提前进行设置,则确实不切实际。
使用监听器的替代方法是使用nil
。一旦初始化完成,这将触发:
NotificationCenter