You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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控制台创建的用户:
Firebase Auth控制台创建的用户
同步前的空Firestore数据库:
空的Firestore数据库

内容的提问来源于stack exchange,提问作者askit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:48:01