Vraag Fouten in nieuwe Firebase en Swift afhandelen


Ik probeer foutafhandeling toe te voegen bij het maken van de gebruikersknop in het iOS-project met behulp van swift en firebase:

Hier is de code voor de knop:

     @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

Ik weet niet zeker of de syntaxis van de fouten in de schakelinstructie correct is of niet!

Omdat toen ik het in de simulator testte het me altijd de defualt-zaak geeft die een onbekende fout is! + Ik kon de syntaxis niet vinden in de documentatie: https://firebase.google.com/docs/auth/ios/errors

Dus, wat is de juiste syntaxis om foutafhandeling toe te voegen met behulp van nieuwe firebase en snel!


10
2017-08-20 12:29


oorsprong


antwoorden:


Ik heb hier eigenlijk vrij lang mee geworsteld en ontdekt wat de kwestie was. Ik heb de code geprobeerd die in een antwoord hierboven wordt gepost en de error.code lijn gaf me een fout. Het werkte echter wel met error._code. Met andere woorden, dank voor het originele antwoord aan Paul met een kleine aanpassing. Hier is mijn definitieve code (ik zal het echter voor alle fouten aanpassen):

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

22
2017-10-03 06:39



Hoewel dit correct is beantwoord, wilde we een mooie implementatie delen die we aan ons project hebben toegevoegd.

Dit kan ook worden gedaan voor andere fouttypen, maar we hebben het alleen nodig voor de FIRAuthErrorCodes.

Als u FIRAuthErrorCode uitbreidt om een ​​variable errorMessage van het type string te hebben, kunt u uw eigen foutmeldingen voor de gebruikers hebben:

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

U kunt slechts enkele aanpassen zoals we hierboven hebben en de rest groeperen onder "Onbekende fout".

Met deze extensie kun je een fout afhandelen zoals wordt getoond in het antwoord van Vladimir Romanov:

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

6
2018-05-17 09:08



Bijgewerkt voor Swift 4 + Firebase 4 + UIAlertController

extension AuthErrorCode {
    var errorMessage: String {
        switch self {
        case .emailAlreadyInUse:
            return "The email is already in use with another account"
        case .userNotFound:
            return "Account not found for the specified user. Please check and try again"
        case .userDisabled:
            return "Your account has been disabled. Please contact support."
        case .invalidEmail, .invalidSender, .invalidRecipientEmail:
            return "Please enter a valid email"
        case .networkError:
            return "Network error. Please try again."
        case .weakPassword:
            return "Your password is too weak. The password must be 6 characters long or more."
        case .wrongPassword:
            return "Your password is incorrect. Please try again or use 'Forgot password' to reset your password"
        default:
            return "Unknown error occurred"
        }
    }
}


extension UIViewController{
    func handleError(_ error: Error) {
        if let errorCode = AuthErrorCode(rawValue: error._code) {
            print(errorCode.errorMessage)
            let alert = UIAlertController(title: "Error", message: errorCode.errorMessage, preferredStyle: .alert)

            let okAction = UIAlertAction(title: "Ok", style: .default, handler: nil)

            alert.addAction(okAction)

            self.present(alert, animated: true, completion: nil)

        }
    }

}

Gebruik voorbeeld:

    Auth.auth().signIn(withEmail: email, password: password, completion: { (user, error) in

        if error != nil {
            print(error!._code)
            self.handleError(error!)      // use the handleError method
            return
        }
        //successfully logged in the user

    })

6
2018-05-16 08:20



FIRAuthErrorCode is een int enum, geen string-opsomming. Doe het volgende:

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

Meer info hierin antwoord.


2
2017-08-20 18:34