Swift Firebase Authentication - два вопроса об обработке ошибок (я не знаю, как назвать эти ошибки) - PullRequest
3 голосов
/ 24 января 2020

Трудно найти правильное название для этого вопроса. Пожалуйста, будь осторожен со мной. Первая часть - проверка, существует ли учетная запись:

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;
            }
        })

Как вы можете видеть, у меня есть что-то под названием Unhandled error с сообщением Undefined error. Я не знаю, как правильно назвать это. Может кто-нибудь объяснить мне эту часть?

Второй вопрос - получить локализованную строку - есть идеи, как сделать ее причудливой?

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)");
            }
        }

Спасибо за советы:)

1 Ответ

1 голос
/ 03 февраля 2020

Вы можете обработать 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, используя AuthErrorCode, предоставленный самой Firebase, а затем я передаю полученную ошибку код с использованием error._code. Итак, теперь я могу получить тип AuthErrorCode. Используя это, я делаю дела вроде .emailAlreadyInUser, .accountExistsWithDifferentCredential et c. Вы можете просто набрать ., и он покажет вам все 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, данное мной в файл локализации. Если вы не знаете о локализации, вам нужно выполнить поиск в Google. Допустим, у меня есть два 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 предоставляет локализованные коды ошибок (что я думаю, что нет), невозможно получить описание ошибки на каждом языке. Так что это лучший способ, который я придумал. Возможно, это не лучший метод в мире, но он выполняет задачу.

PS: Чтобы оптимизировать это во всем приложении, вы можете создать расширение AuthErrorCode или создать * Функция 1056 *, где вы просто передадите error._code, и он вернет localized string. Я добавил длинный путь, чтобы вы могли лучше понять все.

...