मेरे पास समस्या है, यहां तक ​​​​कि जब मैं गलत पासवर्ड डालता हूं, तो मेरा ऐप मुझे सफलता लॉगिन के बारे में जानकारी दिखा रहा है, लेकिन वास्तव में ऐसा नहीं है। इसे ठीक से काम कैसे करें?

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

        // Login

        Auth.auth().signIn(withEmail: userEmail, password: userPassword) { [weak self] authResult, error in
            guard self != nil else {
                self?.displayAlertMessage(alertTitle: "Alert", alertMessage: "Wrong password.");
                return }
        }

        self.displayAlertMessage(alertTitle: "Success", alertMessage: "You are successfuly sign in.", dismiss: true);

        // Return to initial view
0
Yardi 25 फरवरी 2020, 20:06

3 जवाब

Auth.auth().signIn() अतुल्यकालिक है और तुरंत लौटता है। आपके द्वारा पास किया गया कॉलबैक साइन इन के परिणामों के साथ कुछ समय बाद लागू किया जाएगा। आपका कोड जो कर रहा है वह साइन इन पूर्ण होने से तुरंत पहले self.displayAlertMessage(alertTitle: "Success",...) पर कॉल कर रहा है। signIn() को कॉल करने के बाद आपको केवल कॉलबैक के अंदर साइन इन परिणामों की अपेक्षा करनी चाहिए, कोड की अगली पंक्ति पर नहीं।

0
Doug Stevenson 25 फरवरी 2020, 20:09

यह फ़ंक्शन मैंने अपने वर्तमान एप्लिकेशन के लिए लिखा था।

func loginButtonTapped() {
    indicator.setupIndicatorView(view, containerColor: .white, indicatorColor: .CustomGreen())
    view.alpha = 0.7
    let email = mainView.userEmail
    let password = mainView.userPassword
    Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
        if error == nil {
            if Auth.auth().currentUser?.isEmailVerified == true {
                self.view.alpha = 1.0
                self.indicator.hideIndicatorView()
                print("Logined")
            } else {
                Auth.auth().currentUser?.sendEmailVerification(completion: { (error) in
                    if error == nil {
                        self.view.alpha = 1.0
                        self.indicator.hideIndicatorView()
                        Alert.showAlert(title: "Warning", subtitle: "You have not activate your account yet. We have sent you an email to activate it.", leftView: UIImageView(image: #imageLiteral(resourceName: "isWarningIcon")), style: .warning)
                    } else {
                        self.view.alpha = 1.0
                        self.indicator.hideIndicatorView()
                        Alert.showAlert(title: "Error", subtitle: "Incorrect email.", leftView: UIImageView(image: #imageLiteral(resourceName: "isErrorIcon")), style: .danger)
                    }
                })
            }
        } else {
            self.view.alpha = 1.0
            self.indicator.hideIndicatorView()
            Alert.showAlert(title: "Error", subtitle: "Incorrect email or password.", leftView: UIImageView(assetIdentifier: AssetIdentifier.error)!, style: .danger)
        }
    }
}
0
Ahmed Abd Elaziz 25 फरवरी 2020, 20:51

जैसा कि डौग ने अपने उत्तर में उल्लेख किया है, फायरबेस एसिंक्रोनस है और डेटा केवल फ़ंक्शन कॉल के बाद बंद होने के भीतर ही मान्य है। उस डेटा को मान्य होने में समय लगता है, इसलिए क्लोजर के बाद फंक्शन कॉल के बाहर के किसी भी कोड को क्लोजर के अंदर कोड से पहले कॉल किया जाएगा।

तो आपके कोड के लिए इसका क्या अर्थ है

Auth.auth().signIn(withEmail: userEmail, password: userPassword) { [weak self] authResult, error in
     //this code will execute *after* the code that displays success
}

//this code will execute *before* the code within the closure following the signIn 
self.displayAlertMessage(alertTitle: "Success"

यहां कुछ नमूना कोड दिए गए हैं जो त्रुटियों को संभालते हैं और कोड प्रवाह के लिए उचित क्रम प्रदान करते हैं।

Auth.auth().signIn(withEmail: user, password: pw, completion: { (auth, error) in
    if let x = error {
        let err = x as NSError
        switch err.code {
        case AuthErrorCode.wrongPassword.rawValue:
            print("wrong password")
        case AuthErrorCode.invalidEmail.rawValue:
            print("invalued email")
        case AuthErrorCode.accountExistsWithDifferentCredential.rawValue:
            print("accountExistsWithDifferentCredential")
        default:
            print("unknown error: \(err.localizedDescription)")
        }
    } else {
        if let _ = auth?.user {
            print("authd") //user is auth'd proceed to next step
        } else {
            print("authentication failed - no auth'd user")
        }
    }
})
0
Jay 26 फरवरी 2020, 19:00