使用 State listener Swift 5 实施 Firebase Auth 的正确方法

Right way to implement Firebase Auth with State listener Swift 5

ios 开发和 Firebase 非常陌生。

我已经实现了一个标准的 运行-of-the-mill ui 流程,在该流程中,应用程序会打开启动画面,检查用户是否已登录并取决于用户被重定向到登录屏幕或主屏幕的状态。我正在尝试从 auth 侦听器获取用户 ID,并且我在 userManager 中的一些 getUserId 调用发生在 firebase auth 提供非零用户 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 侦听器状态更改为非零值之前开始

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

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

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

像这样:

里面UserManager声明:

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

里面addStateDidChangeListener完成:

authDidChange?(user.uid)

因此,当您使用 UserManager 时,您将获得这样的身份验证更新:

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