Firebase iOS用户身份验证:避免退出应用程序

时间:2018-03-17 10:05:40

标签: ios swift firebase firebase-authentication

在我的应用程序中,我使用两种方法在任何给定时间获取当前用户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.但是,我不太明白

  • 方法1和3之间的区别
  • 当1和3无法建立连接时应用程序应该做什么?是否应该冻结,直到重新建立连接?我担心方法1和3可能更容易崩溃。但方法2经常看起来很烦人。

通常,一旦用户使用Firebase进行了正确的身份验证,应用程序是否有理由返回登录屏幕?用户是否可以在任意时间段内保持登录状态(例如Facebook会这样)?如果是这样,我可以通过哪种方法实现这一目标?

1 个答案:

答案 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