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
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"}]
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.
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;)
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);
}];
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)")
}
})
}
}
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)
})
}
}
}
})
}
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.
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