SwiftUI实现Firebase密码更新功能运行失败问题求助
问题定位
- 核心问题1:
LoginViewModel里的credential变量从未被赋值,updatePassword方法里的if let credential = credential判断永远不通过,所有更新逻辑直接跳过,这是点击无反应的最主要原因。 - 核心问题2:缺少身份验证凭证生成逻辑:Firebase修改密码、修改邮箱等敏感操作前必须先重新验证用户身份,需要用用户输入的旧密码+当前登录用户的邮箱,生成
EmailAuthCredential凭证才能走通重认证流程。 - 其他问题:
- 没有做前置表单校验:未判断新密码与确认密码是否一致、密码长度是否符合Firebase要求(最少6位)、输入项是否为空
- 无任何操作反馈:成功/失败都没有提示,用户无法感知操作结果
- 提前存储
currentUser可能存在状态过时问题,建议在调用方法时实时获取当前登录用户
修正代码
1. 修正后的LoginViewModel
class LoginViewModel: ObservableObject { // 用于给视图反馈操作结果 @Published var showAlert = false @Published var alertMsg = "" func updatePassword(oldPwd: String, newPwd: String, confirmPwd: String) { // 前置校验 guard !oldPwd.isEmpty, !newPwd.isEmpty, !confirmPwd.isEmpty else { alertMsg = "请填写所有密码项" showAlert = true return } guard newPwd == confirmPwd else { alertMsg = "两次输入的新密码不一致" showAlert = true return } guard newPwd.count >= 6 else { alertMsg = "新密码长度不能少于6位" showAlert = true return } guard let currentUser = Auth.auth().currentUser, let userEmail = currentUser.email else { alertMsg = "当前未获取到登录用户信息,请重试" showAlert = true return } // 生成重认证凭证 let credential = EmailAuthProvider.credential(withEmail: userEmail, password: oldPwd) // 先走重认证 currentUser.reauthenticate(with: credential) { [weak self] _, error in guard let self = self else { return } if let error = error { self.alertMsg = "原密码验证失败:\(error.localizedDescription)" self.showAlert = true return } // 重认证成功,更新密码 currentUser.updatePassword(to: newPwd) { error in if let error = error { self.alertMsg = "密码更新失败:\(error.localizedDescription)" } else { self.alertMsg = "密码更新成功" } self.showAlert = true } } } }
2. 修正后的表单视图调用部分
只需要替换按钮逻辑,并新增全局提示弹窗即可:
Button(action: { loginViewModel.updatePassword(oldPwd: oldPassword, newPwd: newPassword, confirmPwd: confirmPassword) }) { Text("Save") } // 新增操作结果提示 .alert(isPresented: $loginViewModel.showAlert) { Alert(title: Text("提示"), message: Text(loginViewModel.alertMsg), dismissButton: .default(Text("确定"))) }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

