Swift Firebase 身份验证 - 有关错误处理的两个问题(我不知道如何命名这些错误)

标签 swift error-handling firebase-authentication alert error-messaging

这个问题真的很难找到合适的标题。请对我轻松一些。 第一部分是检查帐户是否存在:

Auth.auth().fetchSignInMethods(forEmail: userEmail, completion: {
            (providers, error) in

            if error != nil {
                self.displayAlertMessage(alertTitle: "Unhandled error", alertMessage: "Undefined error #SignUpViewController_0001");
                return;
            } else if providers != nil {
                self.displayAlertMessage(alertTitle: "Error", alertMessage: "This account is not exist.");
                return;
            }
        })

如您所见,我有一个名为“未处理的错误”的内容,其中包含消息“未定义的错误”。我不知道如何正确命名它。有人可以向我解释一下这部分吗?

第二个是关于获取本地化字符串 - 有什么想法让它变得更奇特吗?

Auth.auth().createUser(withEmail: userEmail, password: userPassword) { user, error in if error == nil && user != nil {
            self.displayAlertMessage(alertTitle: "Success", alertMessage: "Your account created successfully. We send you a verification email.", dismiss: true);
            } else {
            self.displayAlertMessage(alertTitle: "Firebase error", alertMessage: "(error!.localizedDescription)");
            }
        }

感谢您的提示:)

最佳答案

您可以处理Errors这样:

 Auth.auth().fetchSignInMethods(forEmail: email, completion: { (response, error) in

        if let error = error, let errCode = AuthErrorCode(rawValue: error._code)
        {
            switch errCode {
            case .emailAlreadyInUse:
                GeneralHelper.sharedInstance.displayAlertMessage(titleStr: LocalizeConstant.CommonTitles.Alert.rawValue.localizedStr(), messageStr: LocalizeConstant.CommonTitles.Continue.rawValue.localizedStr())
            case .accountExistsWithDifferentCredential:
                GeneralHelper.sharedInstance.displayAlertMessage(titleStr: LocalizeConstant.CommonTitles.Alert.rawValue.localizedStr(), messageStr: LocalizeConstant.CommonTitles.Continue.rawValue.localizedStr())
            default:
                break
            }

            return
        }
}

我在这里得到errCode使用AuthErrorCodeFirebase提供然后,我使用 error._code 传递收到的错误代码。所以,现在我可以获得 AuthErrorCode 的类型。使用这个我正在制作类似 .emailAlreadyInUser 的案例, .accountExistsWithDifferentCredential等等。您只需输入 .它会向您显示所有 AuthErrorCodes 。因此,您可以通过这种方式简单地处理错误代码。

现在,进入问题的第二部分,即 getting localized string 。您可以将本地化添加到 Firebase ,为此您必须选择语言代码。 Auth.auth().languageCode = "en" //For English 。但是,我不认为它会给出本地化错误,因为有比 Firebase 更多的语言。支持。这个主要用于发送localized电子邮件。

处理localization ,你必须像我一样创建你自己的方法。你可以看到我调用了一个函数displayAlertMessage我正在其中传递 titleStr: LocalizeConstant.CommonTitles.Alert.rawValue.localizedStr() ,这是本地化的一部分。

struct LocalizeConstant {

   enum CommonTitles: String
   {
    case Alert = "common_alert"
   }

}

该值指定为 key我在本地化文件中给出的。如果您不了解本地化,则必须进行谷歌搜索。假设我有两个 Localizable.strings一个在 English另一个在 French 中。在 Localizable.strings(English) ,我写了Alert像这样:

"common_alert" = "Alert";

并且,法语:

"common_alert" = "Alerte!";

所以,这就是我手动添加localization的方式在我的应用程序中。但是,要实现这一目标,您必须做两件事。 1)您必须设置您的appLanguage 。 2) 您必须调用一个方法,该方法将从 Localizable.strings 中定义的这些键中获取值。文件。

为此,我创建了一个方法 localizedStr() 。它是 String 的扩展您可以按如下方式使用它。

extension String{
  func localizedStr() -> String
  {
    var finalRes = ""

    if let path = Bundle.main.path(forResource: Constants.appLang, ofType: "lproj") //Constants.appLang is "en" here for "English", but you can set accordingly.
    {
        if let bundle = Bundle(path: path)
        {
            finalRes = NSLocalizedString(self, tableName: nil, bundle: bundle, value: " ", comment: " ")
        }
    }

    return finalRes
 }
}

现在,这个方法localizedStr()将根据您的应用程序语言为您提供本地化字符串。即使,如果Firebase提供本地化的错误代码(我认为没有),不可能获得每种语言的错误描述。所以这是我想出的最好的方法。它可能不是世界上最好的方法,但它可以完成任务。

P.S.:要在整个应用程序中优化此功能,您可以创建 AuthErrorCode 的扩展。或者您可以创建一个 Helper函数,您只需传递 error._code它将返回 localized string 。我添加了长篇大论,以便您能够以最好的方式理解所有内容。

关于Swift Firebase 身份验证 - 有关错误处理的两个问题(我不知道如何命名这些错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59902031/

相关文章:

ios - 无法执行方法--错误 :Value of type 'UITableViewCell' has no member 'getCell'

ios - 如何制作彩色和半透明的导航栏(iOS)?

c# - 如何查看在asp.net应用程序中引发的原始错误

javascript - 获取用户是否在 Firebase 上进行了身份验证initialApp

javascript - Firebase:为什么 `onAuthStateChanged` 总是返回一个用户?

ios - 如何根据手机旋转来旋转 Sprite

ios - 我们可以在 UITextField 的扩展中调用委托(delegate)吗

python - "OverflowError: Allocated too many blocks":

php - 在 phpFiddle.org 上运行良好的代码在 Web 服务器上崩溃

android - Firebase 电子邮件验证链接中的深层链接不起作用