我正在使用带有初始 SignInViewController
的 Firebase 构建一个应用程序,它加载一个登录页面供用户使用电子邮件进行身份验证,这会触发以下方法:
@IBAction func didTapSignIn(sender: AnyObject) {
let email = emailField.text
let password = passwordField.text
FIRAuth.auth()?.signInWithEmail(email!, password: password!) { (user, error) in
if let error = error {
print(error.localizedDescription)
return
}
self.signedIn(user!)
}
}
func signedIn(user: FIRUser?) {
AppState.sharedInstance.displayName = user?.displayName ?? user?.email
AppState.sharedInstance.signedIn = true
NSNotificationCenter.defaultCenter().postNotificationName(Constants.NotificationKeys.SignedIn, object: nil, userInfo: nil)
performSegueWithIdentifier(Constants.Segues.SignInToHome, sender: nil)
}
SignInViewController
还会在应用启动时检查是否有缓存的当前用户,如果有,则让该用户登录:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
//Synchronously gets the cached current user, or null if there is none.
if let user = FirebaseConfigManager.sharedInstance.currentUser {
self.signedIn(user)
}
}
一旦用户登录,应用程序就会跳转至 HomeScreenViewController
,它会在导航栏的左上角显示一个“退出”按钮。当用户点击“退出”按钮时,该用户应该退出,应用程序应该使用以下方法返回到 SignInViewController
:
@IBAction func didTapSignOut(sender: UIBarButtonItem) {
print("sign out button tapped")
let firebaseAuth = FIRAuth.auth()
do {
try firebaseAuth?.signOut()
AppState.sharedInstance.signedIn = false
dismissViewControllerAnimated(true, completion: nil)
} catch let signOutError as NSError {
print ("Error signing out: \(signOutError)")
} catch {
print("Unknown error.")
}
}
当我点击“退出”按钮时,didTapSignOut
方法被调用并执行。
但是,在执行 try firebaseAuth?.signOut()
行代码后,当前用户应该是 nil
。但是当我在 Xcode 控制台中打印出当前用户时,当前用户仍然处于登录状态:
po FIRAuth.auth()?.currentUser
▿ Optional<FIRUser>
- Some : <FIRUser: 0x7fde43540f50>
由于当前用户在 firebaseAuth?.signOut()
被调用后没有退出,一旦应用返回到 SignInViewController
,应用仍然认为那里是缓存的当前用户,以便用户再次登录。
这可能是钥匙串(keychain)问题吗?
是否与调用NSNotificationCenter.defaultCenter().postNotificationName
有关?
我的代码直接来自 Google Firebase Swift Codelab,所以我不确定为什么它不起作用: https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#4
最佳答案
您可以在 View Controller 的 viewDidAppear
方法中添加一个监听器,如下所示:
FIRAuth.auth()?.addStateDidChangeListener { auth, user in
if let user = user {
print("User is signed in.")
} else {
print("User is signed out.")
}
}
这允许您在用户的身份验证状态更改时执行代码。它允许您监听事件,因为 Firebase 的 signOut
方法没有完成处理程序。
关于ios - Firebase - iOS Swift : FIRAuth. auth().signOut() 未注销当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39301815/