Firebase Auth存在用户但打印未登录,如何同步Auth数据到Firestore?
问题根因
你在Firebase Auth控制台手动创建的用户仅存储在Auth后台服务端,客户端本地没有对应登录态,所以Auth.auth().currentUser为空,自然触发no user is signed in的分支,无法写入数据。
步骤1:补充用户登录逻辑
在同步用户数据前,必须先让用户在客户端完成登录操作,调用邮箱密码登录的代码示例:
Auth.auth().signIn(withEmail: "你在控制台创建的邮箱", password: "你创建用户时设置的密码") { [weak self] authResult, error in guard let self = self, error == nil, let user = authResult?.user else { print("登录失败:\(error?.localizedDescription ?? "未知错误")") return } // 登录成功后再执行数据同步 self.syncUserToFirestore(user: user) }
步骤2:优化用户数据同步代码
你原有代码存在两个问题:每次点击按钮重复添加状态监听器、强制解包用户属性有崩溃风险。优化后的完整代码示例:
import UIKit import Firebase import FirebaseFirestoreSwift class UserIdtoFirestoreViewController: UIViewController { let db = Firestore.firestore() // 单独封装同步方法 private func syncUserToFirestore(user: User) { guard let email = user.email else { print("用户邮箱为空,无法同步") return } let uid = user.uid db.collection("users") .document(uid) .setData([ "email": email, "uid": uid ]) { error in if let error = error { print("写入Firestore失败:\(error.localizedDescription)") } else { print("用户数据同步成功") } } } @IBAction func GetUserId(_ sender: UIButton) { print("按钮点击") // 先判断本地是否有登录态,没有的话先调用登录接口 if let currentUser = Auth.auth().currentUser { syncUserToFirestore(user: currentUser) } else { print("用户未登录,先执行登录操作") // 此处调用步骤1的登录逻辑,登录成功后会自动触发同步 } } }
步骤3:确认Firestore权限规则
打开Firebase控制台的Firestore数据库-规则页,确保规则允许已登录用户写入自己的用户文档,示例规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
相关截图参考
Firebase Auth控制台创建的用户:
同步前的空Firestore数据库:
内容的提问来源于stack exchange,提问作者askit
相关产品推荐
相关产品推荐

