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
相关产品推荐
相关产品推荐

