Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase iOS用户身份验证:避免从应用程序注销_Ios_Swift_Firebase_Firebase Authentication - Fatal编程技术网

Firebase iOS用户身份验证:避免从应用程序注销

Firebase iOS用户身份验证:避免从应用程序注销,ios,swift,firebase,firebase-authentication,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 {

在我的整个应用程序中,我使用两种方法在任何给定时间获取当前用户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().signizely()
方法


看看iOS友好的聊天示例,它们有很好的登录流,可以很好地处理已经登录的用户

谢谢你,尼亚姆,我想你提到的一些观点是谷歌登录特有的,但是你帮了我很大的忙。好的,经过检查,我想我可能误解和误用了上面的代码。我认为方法2应该出现在登录屏幕的视图中,如果用户登录,它将直接进入应用程序,否则它将停留在登录屏幕上。我不认为在整个应用程序中都需要方法2和3,一旦我在应用程序中,如果我需要用户ID,我可以用方法1做任何事情。对吗?