2016-08-20 38 views
8

próbuję dodać obsługę błędów w tworzeniu przycisku użytkownika w projekcie iOS za pomocą szybkiego i Firebase:obsługi błędów w Nowym Firebase i Swift

Oto kod dla przycisku:

 @IBAction func Register(sender: AnyObject) { 

    if NameTF.text == "" || EmailTF.text == "" || PasswordTF.text == "" || RePasswordTF == "" || PhoneTF.text == "" || CityTF.text == "" 
    { 
     let alert = UIAlertController(title: "عذرًا", message:"يجب عليك ملىء كل الحقول المطلوبة", preferredStyle: .Alert) 
     alert.addAction(UIAlertAction(title: "نعم", style: .Default) { _ in }) 
     self.presentViewController(alert, animated: true){} 

    } else { 

     if PasswordTF.text != RePasswordTF.text { 
      let alert = UIAlertController(title: "عذرًا", message:"كلمتي المرور غير متطابقتين", preferredStyle: .Alert) 
      alert.addAction(UIAlertAction(title: "نعم", style: .Default) { _ in }) 
      self.presentViewController(alert, animated: true){} 

     } else { 


      FIRAuth.auth()?.createUserWithEmail(EmailTF.text!, password: PasswordTF.text!, completion: { user, error in 
       print(error) 

       if error != nil { 

        let errorCode = FIRAuthErrorNameKey 

        switch errorCode { 
        case "FIRAuthErrorCodeEmailAlreadyInUse": 
         let alert = UIAlertController(title: "عذرًا", message:"الإيميل مستخدم", preferredStyle: .Alert) 
         alert.addAction(UIAlertAction(title: "نعم", style: .Default) { _ in }) 
         self.presentViewController(alert, animated: true){} 

        case "FIRAuthErrorCodeUserNotFound": 
         let alert = UIAlertController(title: "عذرًا", message:"المستخدم غير موجود", preferredStyle: .Alert) 
         alert.addAction(UIAlertAction(title: "نعم", style: .Default) { _ in }) 
         self.presentViewController(alert, animated: true){} 

        case "FIRAuthErrorCodeInvalidEmail": 
         let alert = UIAlertController(title: "عذرًا", message:"الإيميل غير صحيح", preferredStyle: .Alert) 
         alert.addAction(UIAlertAction(title: "نعم", style: .Default) { _ in }) 
         self.presentViewController(alert, animated: true){} 

        case "FIRAuthErrorCodeNetworkError": 
         let alert = UIAlertController(title: "عذرًا", message:"خطأ في الاتصال بالانترنت", preferredStyle: .Alert) 
         alert.addAction(UIAlertAction(title: "نعم", style: .Default) { _ in }) 
         self.presentViewController(alert, animated: true){} 

        default: 
         let alert = UIAlertController(title: "عذرًا", message:"خطأ غير معروف", preferredStyle: .Alert) 
         alert.addAction(UIAlertAction(title: "نعم", style: .Default) { _ in }) 
         self.presentViewController(alert, animated: true){} 



        } 


       } else { 

        FIRAuth.auth()?.signInWithEmail(self.EmailTF.text!, password: self.PasswordTF.text!, completion: { (user: FIRUser?, error: NSError?) in 
         if let error = error { 
          print(error.localizedDescription) 
         } else { 

          self.ref.child("UserProfile").child(user!.uid).setValue([ 
           "email": self.EmailTF.text!, 
           "name" : self.NameTF.text!, 
           "phone": self.PhoneTF.text!, 
           "city" : self.CityTF.text!, 
           ]) 
          print("Sucess") 
          // self.performSegueWithIdentifier("SignUp", sender: nil) 

         } 
        }) 

       } //else 
      }) 

     } //Big else 


    } //Big Big else 
} 


}//end of 

I m nie jestem pewien, czy składnia błędów w instrukcji switch jest poprawna czy nie!

Bo kiedy testowałem to w symulatorze, zawsze daje mi to defualtowy przypadek, który jest nieznanym błędem! + nie mogłem znaleźć składni w dokumentacji: https://firebase.google.com/docs/auth/ios/errors

Więc Jaka jest poprawna składnia, aby dodać obsługi przy użyciu nowego Firebase Swift błąd!

+0

marginesie - nie należy używać wielkich 'if-else' oświadczenia. Mogą być naprawdę mylące w swoim kodzie. Po prostu zrób coś takiego: 'if NameFT.text ==" "... {return}' Dodając 'return', zatrzymujesz dalszą realizację. Aby uzyskać więcej informacji, sprawdź [to pytanie SO] (http://stackoverflow.com/questions/37899049/where-does-this-line-of-code-return-to/37899267#37899267) – penatheboss

Odpowiedz

18

Właśnie zmagałem się z tym przez dość długi czas i odkryłem, o co chodzi. Próbowałem kod umieszczony w odpowiedzi powyżej i linia error.code dał mi błąd. Mimo to działa z error._code. Innymi słowy, zasługują na oryginalną odpowiedź Pawła z niewielką modyfikacją. Oto mój ostatni kod (będę go edytować dla wszystkich błędów choć):

if let errCode = FIRAuthErrorCode(rawValue: error!._code) { 

    switch errCode { 
     case .errorCodeInvalidEmail: 
      print("invalid email") 
     case .errorCodeEmailAlreadyInUse: 
      print("in use") 
     default: 
      print("Create User Error: \(error)") 
    }  
} 
+1

Zanim napiszesz odpowiedź ! Zaktualizowałem swój kod w chwili publikacji i działało idealnie! Mimo wszystko dziekuję! – Mariah

+0

Awesome! Spojrzałem na tak wiele zasobów, które tylko wspominają, że potrafisz sobie poradzić z tymi wadami, ale nie wyjaśniają, w jaki sposób, myślałem, że opublikuję mój kod po tym, jak w końcu go dostałem. –

+0

Uwaga w Swift 3, potrzebuję wykonać mostowanie obsady błędu do NSError, tak, że .code jest narażony, tj. 'if let error = błąd jako NSError? ... ' – xaphod

2

FIRAuthErrorCode to int enum, a nie wyliczenie ciągu. Wykonaj następujące czynności:

if let error = error { 
     switch FIRAuthErrorCode(rawValue: error.code) !{ 
       case .ErrorCodeInvalidEmail: 

Więcej informacji w tym answer.

4

Mimo to zostało odebrane poprawnie, chciałem podzielić się piękny implementację tego dodaliśmy do naszego projektu.

Można to zrobić również dla innych typów błędów, ale potrzebowaliśmy go po prostu do FIRAuthErrorCodes.

Jeśli przedłużyć FIRAuthErrorCode mieć zmienną ErrorMessage typu ciąg, można mieć własne komunikaty o błędach dla użytkowników:

extension FIRAuthErrorCode { 
    var errorMessage: String { 
     switch self { 
     case .errorCodeEmailAlreadyInUse: 
      return "The email is already in use with another account" 
     case .errorCodeUserDisabled: 
      return "Your account has been disabled. Please contact support." 
     case .errorCodeInvalidEmail, .errorCodeInvalidSender, .errorCodeInvalidRecipientEmail: 
      return "Please enter a valid email" 
     case .errorCodeNetworkError: 
      return "Network error. Please try again." 
     case .errorCodeWeakPassword: 
      return "Your password is too weak" 
     default: 
      return "Unknown error occurred" 
     } 
    } 
} 

Można dostosować tylko niektóre, jak mamy powyżej grupa resztę pod " Nieznany błąd".

Z tego rozszerzenia można obsłużyć błędu, jak pokazano w odpowiedzi Władimir Romanow za:

func handleError(_ error: Error) { 
    if let errorCode = FIRAuthErrorCode(rawValue: error._code) { 
     // now you can use the .errorMessage var to get your custom error message 
     print(errorCode.errorMessage) 
    } 
} 
+0

' errorCode' nie ma członka 'errorMessage' – Cesare

+0

@Cesare działa po mojej stronie. Umysł udostępniający więcej kodu? – Andreas

Powiązane problemy