ios - Firebase - iOS Swift : FIRAuth. auth().signOut() 未注销当前用户

标签 ios swift firebase firebase-authentication

我正在使用带有初始 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/

相关文章:

iphone - 为我的设备构建时,如何选择 Xcode 4 将使用哪个构建配置?

ios - 将音频和视频流式传输到 IOS 应用程序

ios - SideNavigationController - 替换 NavigationController 的 rootViewController

ios - UITableView 卡住单元格。如何解决?

ios - Firebase 上的好友列表

javascript - 如何在 strip 中保存卡详细信息(javascript)

javascript - 即使在定义绑定(bind)后也无法读取未定义的属性 'setState'(this.submit)

ios - 跟踪 NSManagedObject 的属性变化

iphone - 找不到我的iPhone的经度和纬度

ios - 隐藏堆栈 View 时,并非所有内容都会在堆栈 View 中进行动画处理