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

Swift中Firebase邮箱密码登录返回内部错误,如何显示无效凭据提示?

解决Firebase邮箱密码登录错误提示问题

Firebase返回的Code=17999错误属于包装后的内部错误,实际的具体错误信息(比如INVALID_LOGIN_CREDENTIALS)藏在底层的NSUnderlyingError和反序列化响应数据里,不能直接通过error.localizedDescription拿到用户友好的提示。你可以通过逐层解析错误的userInfo来提取真实错误信息,再映射为中文提示。

直接在登录回调中处理

Auth.auth().signIn(withEmail: email, password: password) { result, error in
    guard let error = error else {
        // 登录成功逻辑
        return
    }
    
    // 逐层获取最底层的错误
    var currentError: Error = error
    while let underlyingError = currentError.userInfo[NSUnderlyingErrorKey] as? Error {
        currentError = underlyingError
    }
    
    // 解析Firebase返回的反序列化响应数据
    if let responseDict = currentError.userInfo[FIRAuthErrorUserInfoDeserializedResponseKey] as? [String: Any],
       let errors = responseDict["errors"] as? [[String: Any]],
       let firstError = errors.first,
       let errorCode = firstError["message"] as? String {
        
        // 根据错误码返回对应中文提示
        let userMessage: String
        switch errorCode {
        case "INVALID_LOGIN_CREDENTIALS":
            userMessage = "登录凭据无效"
        case "EMAIL_NOT_FOUND":
            userMessage = "该邮箱未注册"
        case "INVALID_PASSWORD":
            userMessage = "密码错误"
        default:
            userMessage = error.localizedDescription
        }
        
        // 向用户展示提示(示例用弹窗)
        let alert = UIAlertController(title: "登录失败", message: userMessage, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        self.present(alert, animated: true)
    } else {
        // 解析失败时使用默认提示
        let alert = UIAlertController(title: "登录失败", message: error.localizedDescription, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        self.present(alert, animated: true)
    }
}

封装成工具函数复用

如果多个地方需要处理Firebase Auth错误,可以封装成工具函数:

func firebaseAuthUserFriendlyMessage(from error: Error) -> String {
    var currentError: Error = error
    // 遍历到最底层错误
    while let underlyingError = currentError.userInfo[NSUnderlyingErrorKey] as? Error {
        currentError = underlyingError
    }
    
    // 解析响应数据
    guard let responseDict = currentError.userInfo[FIRAuthErrorUserInfoDeserializedResponseKey] as? [String: Any],
          let errors = responseDict["errors"] as? [[String: Any]],
          let firstError = errors.first,
          let errorCode = firstError["message"] as? String else {
        return error.localizedDescription
    }
    
    // 错误码与中文提示映射
    switch errorCode {
    case "INVALID_LOGIN_CREDENTIALS":
        return "登录凭据无效"
    case "EMAIL_NOT_FOUND":
        return "该邮箱未注册"
    case "INVALID_PASSWORD":
        return "密码错误"
    case "USER_DISABLED":
        return "账号已被禁用"
    default:
        return error.localizedDescription
    }
}

使用时只需传入错误对象即可:

Auth.auth().signIn(withEmail: email, password: password) { result, error in
    if let error = error {
        let friendlyMsg = firebaseAuthUserFriendlyMessage(from: error)
        // 展示提示给用户
        let alert = UIAlertController(title: "登录失败", message: friendlyMsg, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        self.present(alert, animated: true)
        return
    }
    // 登录成功逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:06:19