在整个应用程序中,我使用两种方式在任何给定时间获取当前用户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)?如果可以,我可以使用哪种方法来实现?

    最佳答案

    仅仅提到您首先提出的几点,您提到在调用方法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

    10-07 19:14
    查看更多