Search code examples
swiftfirebase-authenticationfacebook-authentication

Swift Firebase Facebook login dialog box pop up 2 times


I have a facebook login which using firebase to authenticate the process. However, after I input my login detail and press confirm. It will back to the login page and pop up the facebook login page again. Then I press confirm again. It will display "User Cancel Login".

I am not sure why does it happen 2 times also when i click the confirm button it will display "User Cancel Login"

  func loginButton(FbLoginBtn: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
    let FbloginManager = FBSDKLoginManager()
    FbloginManager.logInWithReadPermissions(["email","public_profile", "user_location", "user_hometown","user_friends"],fromViewController: self, handler: { (result, error) in


    if let error = error {
        print(error.localizedDescription)
            return
    }else if(result.isCancelled) {

        print("User Cancel Login")

    }else{
        let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString)
       print("User\(self.user?.displayName) login successful")
        AppState.instance.signedIn = true
        if AppState.instance.signedIn == false{
        self.firebaseLogin(credential)
        //self.createFirebaseUser()
        self.performSegueWithIdentifier(SEGUE_LOGIN, sender: nil)
    }
    }
    })
}

Solution

  • For me this code work :

    @IBAction func btnFBLoginPressed(sender: AnyObject) {
    
        self.comeFromFB = true
    
        let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
    
        var id:String = ""
        var urlPhoto:String = ""
    
        fbLoginManager.logInWithReadPermissions(["email"], fromViewController: self){ (result, error) -> Void in
            if let error = error
            {
                print(error)
                return
            }
            else
            {
                let fbloginresult : FBSDKLoginManagerLoginResult = result
                if (!result.isCancelled)
                {
                    if(fbloginresult.grantedPermissions.contains("email"))
                    {
                        if((FBSDKAccessToken.currentAccessToken()) != nil){
                            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).startWithCompletionHandler({ (connection, result, error) -> Void in
    
                                let bUserFacebookDict = result as! NSDictionary
    
                                id = bUserFacebookDict["id"]! as! String
                                urlPhoto = "https://graph.facebook.com/"+id+"/picture?width=500&height=500"
    
                                let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString)
                                FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
    
                                self.currentUser.setCurrentUserState(user!.uid, _firstName: bUserFacebookDict["first_name"]! as! String, _name: bUserFacebookDict["last_name"]! as! String, _urlPhoto: urlPhoto, _email:bUserFacebookDict["email"]! as! String, _connected:true)
    
    
                                }
                            })
                        }
                    }
                }
    
            }
        }
    }
    

    Then I add a listener in the ViewDidAppear method with perform segue after "connected" state.