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
相关产品推荐
相关产品推荐

