通过iOS

时间:2017-01-08 09:31:36

标签: ios swift firebase listener firebase-authentication

我已经实施了Firebase授权,可以通过Facebook和Google登录我的iOS应用。我正在编写Swift。 当应用程序启动时,我需要检查用户是否已经登录才能呈现正确的ViewController(例如,如果没有人登录,我会提供登录视图控制器,否则我会显示主视图控制器)。 如果我使用Firebase提供的“简单”解决方案,意思是

if FIRAuth.auth()?.currentUser != nil {
  // User is signed in.
  // ...
} else {
  // No user is signed in.
  // ...
}

因此,检查当前用户是否为零,它恰好发生Firebase指南(https://firebase.google.com/docs/auth/ios/manage-users)警报可能发生的意义

“注意:currentUser也可能是nil,因为auth对象还没有完成初始化。如果你使用监听器来跟踪用户的登录状态,你不需要处理这种情况。”

所以我想按照指南中的建议实现监听器:

handle = FIRAuth.auth()?.addStateDidChangeListener() { (auth, user) in
  // ...
}

侦听器还将处理中间状态,以便在创建Auth对象时触发它。重点是我真的无法让它正常工作。任何人都可以帮我使用这个监听器来检查用户是否已登录?

由于

2 个答案:

答案 0 :(得分:12)

我已经实现了这样:

FIRAuth.auth()?.addStateDidChangeListener { auth, user in
  if let user = user {
    // User is signed in. Show home screen
  } else {
    // No User is signed in. Show user the login screen
  }
}

如果您在检查后不需要User对象,则可以使用布尔测试替换if let user = user,如下所示:

FIRAuth.auth()?.addStateDidChangeListener { auth, user in
  if user != nil {
    // User is signed in. Show home screen
  } else {
    // No User is signed in. Show user the login screen
  }
}

将听众放在哪里(来自评论):

对于我过去检查用户是否已登录的情况,将其放在特定视图控制器中viewDidLoad的开头就足够了。但是,如果您有任何需要在每次进入特定视图控制器时进行检查的情况,那么最好将其放在viewDidAppear的开头。但我认为在大多数情况下,如果用户进入视图,您只需要检查一次

答案 1 :(得分:1)

如果你在StateDidChangeListener中设置application:didFinishLaunchingWithOptions,你会注意到在连接侦听器时会触发一次(设置初始状态,即{{} 1}}初始化时),然后一旦它完成初始化(可能不是nil)。这是预期的行为,但如果您提前进行设置,则确实不切实际。

使用监听器的替代方法是使用nil。一旦初始化完成,这将触发:

NotificationCenter