在我的应用程序中,我使用两种方法在任何给定时间获取当前用户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会这样)?如果是这样,我可以通过哪种方法实现这一目标?
答案 0 :(得分:3)
只要先了解你先提出的几点,你就会在调用方法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