web-dev-qa-db-fra.com

IOS Facebook SDK: la connexion ne renvoie pas de courrier électronique malgré les autorisations accordées

J'essaie d'obtenir des informations via le sdk de facebook, mais jusqu'à présent, je n'obtiens que l'identifiant et le nom de l'utilisateur, bien que je sois certain qu'un e-mail est disponible, car il s'agit de mon compte. J'ai regardé plusieurs réponses ici mais aucune n'a résolu mon problème jusqu'à présent. Qu'est-ce que je fais de travers et pourquoi ne renvoie-t-il pas plus de données car je demande plusieurs autorisations?

Voici mon code:

fbLoginManager.logInWithReadPermissions(["public_profile", "email", "user_friends", "user_about_me", "user_birthday"], handler: { (result, error) -> Void in
        if ((error) != nil)
        {
            // Process error
            println("There were an error: \(error)")
        }
        else if result.isCancelled {
            // Handle cancellations
            fbLoginManager.logOut()
        }
        else {
            var fbloginresult : FBSDKLoginManagerLoginResult = result
            if(fbloginresult.grantedPermissions.contains("email"))
            {
                println(fbloginresult)
                self.returnUserData()
            }
        }
    })

Et la fonction pour obtenir les données de l'utilisateur:

func returnUserData()
{
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in

        if ((error) != nil)
        {
            // Process error
            println("Error: \(error)")
        }
        else
        {
            println("fetched user: \(result)")

            if let userName : NSString = result.valueForKey("name") as? NSString {
                println("User Name is: \(userName)")
            }
            if let userEmail : NSString = result.valueForKey("email") as? NSString {
                println("User Email is: \(userEmail)")
            }
        }
    })
}

Qui retourne:

fetched user: {
id = 55555555;
name = "Kali Aney";
}
User Name is: Kali Aney
13
Kali Aney

Facebook Graph API a rompu sa compatibilité avec les versions antérieures (lorsqu’il était utilisé par défaut) depuis Graph-API version 2.4 (Pod Version 4.4.0).

FB Graph-API 2.4 ne renvoie pas tous les champs par défaut pour l'utilisateur

Pour résoudre ce problème, vous pouvez utiliser explicitement la version graphique 2.3:

[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil tokenString:[FBSDKAccessToken currentAccessToken].tokenString version:@"v2.3" HTTPMethod:nil]

dans ce cas, FB assure que la version 2.3 sera disponible dans au moins 2 ans . https://developers.facebook.com/docs/graph-api/overview :

L'API Graph a plusieurs versions disponibles pour accéder à n'importe lequel temps. Chaque version contient un ensemble de champs de base et d'opérations Edge . Nous garantissons que ces API de base seront disponibles et non modifié dans cette version pendant au moins 2 ans à compter de sa publication. Le Le journal des modifications de plate-forme peut vous dire quelles versions sont actuellement disponible.

OU

vous pouvez utiliser la nouvelle Graph-API (v2.4) en demandant des champs spécifiques qui vous intéressent:

[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields" : @"email,name"}]

38
HeTzi

J'ai lutté avec ce problème pendant presque une journée jusqu'à trouver la réponse de @HeTzi, qui a parfaitement fonctionné. La version Swift d'une telle requête est la suivante:

func referenceFBData() {
    var request = FBSDKGraphRequest(graphPath:"me", parameters: ["fields":"email,first_name,gender"]);

    request.startWithCompletionHandler { (connection : FBSDKGraphRequestConnection!, result : AnyObject!, error : NSError!) -> Void in
        if error == nil {
            println("The information requested is : \(result)")
        } else {
            println("Error getting information \(error)");
        }
    }
}

N'oubliez pas que vous devez d'abord demander les autorisations de lecture appropriées pour obtenir des données à l'aide de cette demande.

7
Trey Pringle

Dans mon cas, le courrier électronique n’a pas été vérifié par l’utilisateur, c’est pourquoi ne pas l’obtenir même après avoir accordé les autorisations;)

5
Ammar Mujeeb

cela fonctionne ... espérons que cela aide ..

NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    [parameters setValue:@"id, name, email" forKey:@"fields"];

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
{
         NSLog(@"Fetched user is:%@", result);
}];
5
user5465487

Testé dans Swift 2.2

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
        print("User Logged In")
if ((error) != nil)
        {
            // Process error
        }
        else if result.isCancelled {
            // Handle cancellations
        }
        else {
            // If you ask for multiple permissions at once, you
            // should check if specific permissions missing
            if result.grantedPermissions.contains("email")
            {
                // Do work
                getUserData()
            }
        }}

func getUserData()
{
    if ((FBSDKAccessToken.currentAccessToken()) != nil)
    {
        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "email, name"])
        graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in

            if ((error) != nil)
            {
                // Process error
                print("Error: \(error)")
            }
            else
            {
                print("fetched user: \(result)")
                let userName : NSString = result.valueForKey("name") as! NSString
                print("User Name is: \(userName)")
                let userEmail : NSString = result.valueForKey("email") as! NSString
                print("User Email is: \(userEmail)")

            }
        })
    }
}
1

Une fonction dans Swift comme ceci:

func fbsignup() {
        let lgManager = FBSDKLoginManager()
        lgManager.logInWithReadPermissions(["public_profile","email"], fromViewController: self,handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
            if error != nil{
                print("facebook error")
            }else if result.isCancelled {
                print("Canceled")
            }else{
                if result.grantedPermissions.contains("email") {
                    if (FBSDKAccessToken.currentAccessToken() != nil) {
                        FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"]) .startWithCompletionHandler({ (connection:FBSDKGraphRequestConnection!, result:AnyObject!, error:NSError!) -> Void in
                            print(result)
                        })
                    }
                }
            }
        })
    }
1
William Hu

Je n'ai jamais travaillé avec IOS, mais j'ai beaucoup d'expérience avec Facebook. Ma première observation est que chaque fois que vous demandez une autorisation Facebook, vous devez vous assurer que: dans le futur proche

Cette liste

["public_profile", "email", "user_friends", "user_about_me", "user_birthday"]

semble être vague. Vous devez vous assurer que vous demandez le nombre minimal de privilèges dont vous aurez sûrement besoin dans un proche avenir.

En ce qui concerne la demande elle-même, vous devez vous assurer que vous utilisez une session Facebook valide. Je le fais comme ça en PHP:

        $request = new \Facebook\FacebookRequest( self::$session, 'GET', '/me' );
        $response = $request->execute();
        // get response
        $graphObject = $response->getGraphObject()->asArray();

Je suis sûr que vous devez également avoir quelque chose comme getGraphObject dans votre SDK.

0
Lajos Arpad

Utilisez ces fonctions cela fonctionnera à coup sûr

@IBAction func fbsignup(_ sender: Any) {
        let fbloginManger: FBSDKLoginManager = FBSDKLoginManager()
        fbloginManger.logIn(withReadPermissions: ["email"], from:self) { (result, error) -> Void in
            if(error == nil){
                let fbLoginResult: FBSDKLoginManagerLoginResult  = result!

                if( result?.isCancelled)!{
                    return }


                if(fbLoginResult .grantedPermissions.contains("email")){
                    self.getFbId()
                }
            }  }

    }
    func getFbId(){
    if(FBSDKAccessToken.current() != nil){
    FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id,name , first_name, last_name , email"]).start(completionHandler: { (connection, result, error) in
    if(error == nil){
    print("result")
    }
    })
    }
    }

et connectez la fbsignup(_sender: Any) function avec votre bouton

0
Ayush Dixit