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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:23:43