如何从FBSDKProfile获取用户的电子邮件地址

我正在升级我的应用程序到Facebook-iOS-SDK-4.0 ,但似乎我不能从FBSDKProfile获取用户电子邮件,因为它只提供,用户名,用户ID等。

要获取电子邮件,您需要使用graphicsAPI,特别是提供填充所需字段的参数字段。 看看Facebook的Graph API探索工具,这可以帮助找出查询。 https://developers.facebook.com/tools/explorer

为我提取电子邮件的代码如下,假设您已经login:

  NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; [parameters setValue:@"id,name,email" forKey:@"fields"]; [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { aHandler(result, error); }]; 

这是正确的。 电子邮件地址不在FBSDKProfile对象中。 您应该使用FB的Graph API。 在FB Developer站点https://developers.facebook.com/docs/ios/graph上有大量的信息和代码示例;

要回答你的问题,请尝试这样的事情。

 if ([FBSDKAccessToken currentAccessToken]) { [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"email"}] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSLog(@"user:%@", result); } }]; } 

代码修正:

  if ([FBSDKAccessToken currentAccessToken]) { [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSLog(@"fetched user:%@", result); } }]; } 

试试这个代码:

 FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { if (error) { // 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 containsObject:@"email"]) { if ([FBSDKAccessToken currentAccessToken]) { [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSLog(@"fetched user:%@", result); } }]; } } } }]; 

这个参数给了电子邮件

 NSDictionary *parameters = @{@"fields":@"email"}; [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { NSLog(@"fetched user:%@", result); }]; 

从Graph API v2.4开始,/ us的GET请求应该包含显式的“fields”参数

我想用我发现的东西来补充这一点。 对于我的FBSDKGraphRequest我试图通过login时要求的权限作为字段。 所以我把fields设置为:

"email,user_location"

但是,权限和字段是不同的。 作为参考,这些是字段: https : //developers.facebook.com/docs/graph-api/reference/v2.4/user

所以根据你想传递的链接:

"email,location"

希望帮助别人!

从Facebook开发者网站https://developers.facebook.com/docs/facebook-login/permissions/v2.2

请注意,即使您要求电子邮件许可,也不保证您将收到电子邮件地址。 例如,如果有人使用电话号码而不是电子邮件地址注册Facebook,则电子邮件字段可能为空。

希望它会帮助别人:)