在整个应用程序中,我使用两种方式在任何给定时间获取当前用户ID。我俩都在某个地方接过电话,而且(据我所知)工作正常。然后,我使用方法3作为方法2的变体。
方法1:
if let user = Auth.auth().currentUser{
let uid = user.uid
}
方法2:
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
// User is signed in.
self.USER = user
self.userID = self.USER?.uid
} else {
// No user is signed in.
let vc = self.storyboard?.instantiateViewController(withIdentifier: "LoginScreen")
self.present(vc!, animated: true, completion: nil)
}
方法3:
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
// User is signed in.
self.USER = user
self.userID = self.USER?.uid
} else {
// No user is signed in.
}
现在看来方法1和方法3在很大程度上等效,而方法2使我更频繁地返回登录屏幕(例如,当电话从3G转到Wifi或飞行模式时)。
鉴于我希望我的应用程序保持登录状态很长时间(即使在进入后台并返回时也是如此),这建议使用方法1或3。但是,我不太了解
通常,一旦用户通过Firebase正确进行了身份验证,该应用程序是否有理由返回登录屏幕?用户是否可以在任意时间段内保持登录状态(例如Facebook)?如果可以,我可以使用哪种方法来实现?
最佳答案
仅仅提到您首先提出的几点,您提到在调用方法2和3时应用程序冻结。你在哪里叫这些?您需要确保它们在主线程上运行,因为它们是异步函数,因此它们不会干扰您的UI。
另外,登录后是否要删除状态更改侦听器?在您的登录VC中,您可以:
deinit {
if let handle = handle {
Auth.auth().removeStateDidChangeListener(handle)
}
}
此外,您可以使用
GIDSignIn.sharedInstance().signInSilently()
方法。看一下iOS友好的聊天示例,它们具有良好的登录流程,并且可以很好地处理已经登录的用户。 https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#0