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

如何在Firebase Authentication中正确使用addStateDidChangeListener?

优化Firebase Auth注册流程的实现建议

看起来你正在搭建iOS端的注册界面并集成Firebase Authentication,我帮你整理并优化了注册按钮的点击逻辑,让代码更健壮且覆盖常见的边界情况:

原始代码片段整理

@IBAction func signUpButtonDidPressed(_ sender: Any) { 
    print("000") 
    SVProgressHUD.show(withStatus: "Harap Tunggu") 
    print("a") 
    userEmail = emailTextField.text! 
    userPassword = passwordTextField.text! 
    print...
    // 后续调用Firebase Auth的createUser方法
}

优化后的完整实现

import FirebaseAuth
import SVProgressHUD

class RegisterVC: UIViewController {
    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    
    private var userEmail: String?
    private var userPassword: String?

    @IBAction func signUpButtonDidPressed(_ sender: Any) {
        print("注册按钮被点击")
        SVProgressHUD.show(withStatus: "Harap Tunggu") // 显示加载提示
        
        // 1. 安全校验输入内容,避免强制解包崩溃
        guard let email = emailTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines),
              let password = passwordTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines),
              !email.isEmpty,
              !password.isEmpty else {
            SVProgressHUD.dismiss()
            showAlert(title: "提示", message: "邮箱和密码不能为空")
            return
        }
        
        // 可选:自定义密码强度校验(Firebase默认要求至少6位)
        guard password.count >= 6 else {
            SVProgressHUD.dismiss()
            showAlert(title: "密码不符合要求", message: "密码长度至少需要6位")
            return
        }
        
        userEmail = email
        userPassword = password
        
        // 2. 调用Firebase Auth创建用户
        Auth.auth().createUser(withEmail: email, password: password) { [weak self] (authResult, error) in
            SVProgressHUD.dismiss() // 无论成功失败都要隐藏加载提示
            guard let self = self else { return }
            
            if let error = error {
                // 处理注册错误,给用户友好提示
                print("注册失败:\(error.localizedDescription)")
                self.showAlert(title: "注册失败", message: error.localizedDescription)
                return
            }
            
            // 3. 注册成功后的后续操作
            if let user = authResult?.user {
                print("注册成功,用户ID:\(user.uid)")
                // 可选:发送邮箱验证邮件
                self.sendVerificationEmail(to: user)
                // 跳转到主界面或登录页
                self.navigationController?.popViewController(animated: true)
            }
        }
    }
    
    // 辅助方法:弹窗提示用户
    private func showAlert(title: String, message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        present(alert, animated: true)
    }
    
    // 可选:发送邮箱验证邮件
    private func sendVerificationEmail(to user: User) {
        user.sendEmailVerification { error in
            if let error = error {
                print("发送验证邮件失败:\(error.localizedDescription)")
            } else {
                print("验证邮件已发送到您的邮箱,请查收")
            }
        }
    }
}

关键改进点说明

  • 安全处理输入:用guard let替代强制解包!,同时去除输入文本的前后空格,避免空值或无效输入导致崩溃
  • 加载提示管理:确保在所有退出路径(输入错误、注册成功/失败)都隐藏加载提示,防止界面卡住
  • 完善错误处理:利用Firebase返回的本地化错误信息,给用户展示清晰的失败原因(比如邮箱格式错误、邮箱已注册等)
  • 代码健壮性:用[weak self]避免循环引用,防止内存泄漏
  • 附加安全功能:添加邮箱验证逻辑,提升账号安全性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:08:53