首页 > 解决方案 > 使用 State listener Swift 5 实现 Firebase Auth 的正确方法

问题描述

对 ios 开发和 Firebase 来说非常新。

我已经实现了一个标准的普通用户界面流程,其中应用程序打开到启动屏幕,检查用户是否登录,并根据用户被重定向到登录屏幕或主屏幕的状态. 我正在尝试从身份验证侦听器获取用户 ID,并且我的一些来自 userManager 的 getUserId 调用发生在 firebase 身份验证提供非零用户 ID 之前,并且用户总是最终进入注册屏幕。很想知道使用侦听器实现获取用户 ID 的最佳实践是什么。这是一些支持我正在做的事情的代码

class UserManager {

    static let shared = UserManager()
    private var currentUserId: String?

    private init() {
        print("init initiated")
        _ = Auth.auth().addStateDidChangeListener { (auth, user) in
            if let user = user {
            // User is signed in
                print("user id is: \(user.uid)")
                self.currentUserId = user.uid
                print("current user id loaded: \(self.currentUserId)")
            }
        }
    }

    func getCurrentUserId() -> String?{
        print("returning user id: \(currentUserId)")
        return currentUserId
    }


控制台的打印输出如下所示:(用户请求在 firebase 侦听器状态更改为非 nil 值之前开始

nit initiated
returning user id: nil
nil
user id is: c0wTlE5EXaao3aO0rH9J6GKvuM43
current user id loaded: Optional("c0wTlE5EXaao3aO0rH9J6GKvuM43")

我已经尝试直接从 AppDelegate 初始化 UserManager,希望在应用程序的其余部分启动时,usermanager 的单例实例能够成功获取最新状态。但它显然不是这样工作的。

标签: iosswiftfirebasefirebase-authenticationswift5

解决方案


你为什么不尝试使用闭包完成处理程序呢?

像这样的东西:

内部UserManager声明:

var authDidChange: ((String) -> Void)?

内部addStateDidChangeListener完成:

authDidChange?(user.uid)

因此,当您使用时,您UserManager将获得如下授权更新:

UserManager.shared.authDidChange = { userId in
    print("The obtained user id is: ", userId)
}

推荐阅读