как отобразить сообщение об ошибке, если адрес электронной почты и пароль неверны в firebase swift?

# #swift #firebase #firebase-authentication

Вопрос:

Попробуйте создать страницу входа в систему в swift, затем я хочу проверить определенное условие для возврата ошибки.

из печати(Ошибка.локализованное описание) Я получаю какую-то отдачу, например

  • Пароль неверен или у пользователя нет пароля.
  • Нет записи пользователя, соответствующей этому идентификатору.

Как проверить это условие на основе Error.localizeDescription ?

 Auth.auth().signIn(withEmail: email, password: pass, completion: {[weak self] result, Error in
            guard let StrongSelf = self else{
                return
            }
            
            if let Error = Error {
                print(Error.localizedDescription)
            }
            
            guard Error == nil else{
                // in here there is validation of return error (e.g. wrong password, account not exist)
                self?.reasonLabel.isHidden=false
                self?.reasonLabel.text=Error
                return
            }
            
            self!.checkinfo()
            
            
        })
 

Комментарии:

1. Привет, Лаувис. Есть какие-нибудь новости здесь? 👆

Ответ №1:

Во-первых, вы не должны объявлять какое-либо свойство с заглавной буквы, вместо этого используйте строчные или верблюжьи буквы, если это необходимо. во-вторых, если вы используете [слабое я] и создаете условие guard let, затем используйте сильное, чтобы предотвратить цикл сохранения и постарайтесь не использовать принудительное разворачивание.

     Auth.auth().signIn(withEmail: email, password: pass, completion: {[weak self] result, error in
        guard let self = self else { return }

        if let error = error {
            print(error.localizedDescription)
            let alert = UIAlertController.configureAlertController(error.localizedDescription)
            self.present(alert, animated: true)
            return
        }
        // your logic

       /* or 
        if let error = error {
            print(error.localizedDescription)
            UIAlertController. showAlert(error.localizedDescription)
        }else{
         // your logic
        }
       */

       /* or
       
       guard let result = result else {
       UIAlertController. showAlert(error?.localizedDescription ?? "unknown error")
       return
       }

       // your logic
       */

       /* 
        or some else, but avoid force unwrap
       */
    })
 

Обратите внимание, что ваше if let заявление с проверкой ошибок не помешает выполнению всего вашего кода и self!.checkinfo() будет выполнено, return в конце if let error.. сообщит вашему методу, что ему нужно остановиться

  extension UIAlertController {
     static func configureAlertController(with title: String = "Attention", message: String) -> (UIAlertController){
         let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
         let action = UIAlertAction(title: "ОК",  style: .default) {(action) in}
         alertController.addAction(action)
    
         return alertController
     }
 }
 

Комментарии:

1. есть ли какая-либо причина, по которой появляется всплывающее окно о том, что у UIAlertController нет элемента configureAlertController

2.не уверен, что вы имеете в виду, создайте расширение для UIAlertController, создайте свой собственный метод и назовите его configureAlertController — это будет элемент ur. Если вам не нужен UIAlertController, но вам нужно self.reasonLabel.isHidden = false self.reasonLabel.text = error.localizedDescription сделать это вместо предупреждения

3. @lauwispremium каким-либо образом эта часть вашего кода не вызывает ошибку компиляции? self?.reasonLabel.text=Error это должно быть своего рода self?.reasonLabel.text=Error.localizedDescription — это String

Ответ №2:

Если вы хотите предпринять определенное действие на основе ошибки, вызванной проверкой подлинности Firebase, анализ Error.localizeDescription -не лучший способ сделать это. Вместо этого проверьте ошибку code NSError объекта, которую вы получаете в обработчике завершения, снова по значениям, указанным в документации по обработке ошибок.

Например (на основе этого репо:

 switch error {
  case let .some(error as NSError)
    where UInt(error.code) == FUIAuthErrorCode.userCancelledSignIn.rawValue:
    print("User cancelled sign-in")
  case .none:
    if let user = authDataResult?.user {
      signed(in: user)
    }
  }
}