Firebase Swift:如何阻止未验证邮箱的新用户登录?
嘿,你已经搞定了注册时发送邮箱验证邮件的核心逻辑,接下来只需要把登录环节的邮箱验证检查补全,就能实现「未验证邮箱无法进入主界面」的需求啦!下面是完善后的代码和关键说明:
1. 修正登录按钮的逻辑
你的登录按钮方法需要先完成Firebase登录流程,之后再检查用户的邮箱验证状态。如果未验证,就提示用户并清理当前登录状态;如果已验证,再跳转到主界面。
@IBAction func loginVC(_ sender: Any) { // 先确保邮箱和密码输入不为空 guard let email = emailTextField.text, !email.isEmpty, let password = passwordTextField.text, !password.isEmpty else { ProgressHUD.showError("请填写邮箱和密码") return } // 执行Firebase登录 Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in guard let self = self else { return } if let error = error { ProgressHUD.showError("登录失败:\(error.localizedDescription)") return } // 登录成功后,检查邮箱验证状态 guard let currentUser = Auth.auth().currentUser else { ProgressHUD.showError("无法获取用户信息") return } // 注意:必须刷新用户信息,确保isEmailVerified是最新状态 currentUser.reload { reloadError in if let reloadError = reloadError { ProgressHUD.showError("刷新用户信息失败:\(reloadError.localizedDescription)") return } if currentUser.isEmailVerified { // 邮箱已验证,跳转到主界面 self.goToMainApp() } else { // 邮箱未验证,提示用户并退出登录 ProgressHUD.showError("请先验证你的邮箱") do { try Auth.auth().signOut() } catch let signOutError { print("退出登录失败:\(signOutError.localizedDescription)") } } } } } // 跳转到主界面的方法(根据你的实际项目调整) private func goToMainApp() { // 示例:通过故事板切换根视图控制器 let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) guard let mainVC = mainStoryboard.instantiateViewController(withIdentifier: "MainViewController") as? MainViewController else { return } UIApplication.shared.keyWindow?.rootViewController = mainVC }
2. 关键细节说明
- 必须刷新用户信息:调用
currentUser.reload()非常重要,因为本地缓存的用户信息可能没有及时更新验证状态,刷新后才能拿到最新的isEmailVerified值。 - 未验证时退出登录:如果用户邮箱未验证,调用
signOut()清理当前登录状态,避免用户停留在未授权的登录态。 - 输入校验优化:新增了邮箱和密码的非空校验,避免空值导致的登录错误。
3. 注册环节的小优化
你的注册代码逻辑没问题,用guard语句替换原有的空值判断会更简洁易读:
@IBAction func emailRegisterButtonPressed(_ sender: Any) { guard let email = emailTextField.text, !email.isEmpty, let firstName = nameTextField.text, !firstName.isEmpty, let lastName = lastnameTextField.text, !lastName.isEmpty, let password = passwordTextField.text, !password.isEmpty else { ProgressHUD.showError("请填写所有必填信息") return } FUser.registerUserwith(email: email, password: password, firstName: firstName, lastName: lastName) { error in if let error = error { print("注册用户失败:\(error.localizedDescription)") ProgressHUD.showError("注册失败:\(error.localizedDescription)") return } // 发送邮箱验证邮件 Auth.auth().currentUser?.sendEmailVerification { error in if let error = error { ProgressHUD.showError("发送验证邮件失败:\(error.localizedDescription)") return } ProgressHUD.showSuccess("请检查你的邮箱完成验证") } } }
这样整个流程就完整了:用户注册后收到验证邮件,登录时必须完成邮箱验证才能进入主界面,未验证的话会被提示并退出登录。
内容的提问来源于stack exchange,提问作者user3700449
相关产品推荐
相关产品推荐

