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

Firebase数据库未接收用户信息问题求助(iOS开发)

解决Firebase认证成功但用户信息未写入数据库的问题

Hey there! 作为刚接触Firebase的iOS新手,遇到这种认证成功但用户数据没进数据库的情况太正常了,我帮你拆解下问题所在,一步步搞定:

1. 核心问题:用户ID关联错误

你现在用refUsers.childByAutoId().key生成数据库用户节点的ID,但Firebase Auth创建用户后,每个用户都有一个唯一的认证UID(user.user.uid),应该用这个UID作为数据库节点的Key——这样既能保证认证用户和数据库用户一一对应,也能避免后续数据关联的麻烦,还能配合数据库权限规则做更安全的访问控制。

咱们修改createAccountTapped和addUser函数:

@IBAction func createAccountTapped(_ sender: Any) {
    // 先做输入校验:确保所有字段非空、密码匹配
    guard let email = emailTextField.text, !email.isEmpty,
          let password = passwordTextField.text, !password.isEmpty,
          let confirmPassword = confirmPasswordTextField.text, confirmPassword == password,
          let firstName = firstNameTextField.text, !firstName.isEmpty,
          let lastName = lastNameTextField.text, !lastName.isEmpty,
          let phoneNumber = phoneNumberTextField.text, !phoneNumber.isEmpty else {
        print("请检查输入:所有字段不能为空,且两次密码需一致")
        // 这里可以加个Alert提示用户,体验更好
        return
    }
    
    Auth.auth().createUser(withEmail: email, password: password) { [weak self] authResult, error in
        guard let self = self else { return } // 避免循环引用
        
        if let firebaseError = error {
            print("认证失败:\(firebaseError.localizedDescription)")
            return
        }
        
        // 获取认证用户的唯一UID
        guard let userId = authResult?.user.uid else {
            print("无法获取用户认证UID")
            return
        }
        
        // 调用更新数据库的方法,传入UID和用户信息
        self.addUser(toDatabaseWith: userId, firstName: firstName, lastName: lastName, phoneNumber: phoneNumber)
        self.presentMainScreen()
    }
}

func addUser(toDatabaseWith userId: String, firstName: String, lastName: String, phoneNumber: String){
    let userData = [
        "FirstName": firstName,
        "LastName": lastName,
        "PhoneNumber": phoneNumber,
        "Email": emailTextField.text ?? "" // 可选:把邮箱也存进数据库方便后续使用
    ]
    
    // 用认证UID作为数据库节点的Key,写入数据
    refUsers.child(userId).setValue(userData) { error, _ in
        if let error = error {
            print("写入数据库失败:\(error.localizedDescription)")
        } else {
            print("用户信息已成功写入数据库!")
        }
    }
}

2. 检查Firebase数据库权限规则

默认情况下,Firebase Realtime Database的规则可能限制了写入权限,这也是数据没进去的常见原因。

  • 开发阶段:可以暂时把规则改成允许认证用户读写(方便调试):
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
  • 上线前:一定要改成更严格的规则,比如只允许用户读写自己的节点:
{
  "rules": {
    "Users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

3. 优化可选值处理,避免潜在问题

你之前的代码里用了firstNameTextField.text!这种强制解包操作,如果用户没输入内容,虽然现在没崩溃,但可能导致数据异常或者后续崩溃。上面的代码用guard let做了完整的输入校验,确保所有字段都有值再执行后续操作,更安全。

4. 内存管理小优化

在认证的闭包里用[weak self]可以避免循环引用,防止内存泄漏,这个细节虽然不影响当前问题,但养成好习惯很重要~

修改完这些后,重新运行应用创建账户,再去Firebase控制台的Realtime Database里查看Users节点,就能看到用户的姓名、电话等信息啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:51:03