ios - 使用 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 的单例实例能够成功获取最新状态。但它显然不是这样工作的。
解决方案
你为什么不尝试使用闭包完成处理程序呢?
像这样的东西:
内部UserManager
声明:
var authDidChange: ((String) -> Void)?
内部addStateDidChangeListener
完成:
authDidChange?(user.uid)
因此,当您使用时,您UserManager
将获得如下授权更新:
UserManager.shared.authDidChange = { userId in
print("The obtained user id is: ", userId)
}
推荐阅读
- javascript - 使用范围滑块时停止 dragscroll.js
- python - 如何使用python更改XML中标签内的文本
- amazon-s3 - AWS Lambda 中的 Twilio HTTP Post 处理
- php - openssl_pkey_get_private 为一个键返回 false
- python - python:连续颜色分级
- sql - 为什么 PostgreSQL 不解析大型 XML 数据?
- python-3.x - 内部错误:Blas GEMV 启动失败:m=4,n=800 [[{{node PartitionedCall/MatMul}}]] [Op:__inference_train_97]
- java - Android游戏中runOnUiThread的目的是什么?
- python - Django 不一致迁移历史
- wordpress - 在自定义帖子类型中添加额外的文件