[Facebook-iOS-SDK 4.0]如何从FBSDKProfile获取用户电子邮件地址

时间:2015-03-28 22:14:43

标签: objective-c facebook-ios-sdk facebook-ios-sdk-4.0

我正在将我的应用升级到 Facebook-iOS-SDK-4.0 ,但似乎我无法从FBSDKProfile收到用户电子邮件,因为它只提供用户名,用户ID等等。

8 个答案:

答案 0 :(得分:128)

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

对我来说,提取电子邮件的代码如下,假设您已经登录:

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

答案 1 :(得分:28)

那是对的。电子邮件地址不存在于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);       
      }
  }];
}

答案 2 :(得分:6)

代码更正:

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

答案 3 :(得分:5)

试试这段代码:

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

答案 4 :(得分:3)

这些参数提供了电子邮件

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开始,对/ me的GET请求应该包含一个   明确的"字段"参数

答案 5 :(得分:2)

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

  

请注意,即使您申请电子邮件权限,也不能保证   你会得到一个电子邮件地址。例如,如果有人注册了   Facebook上有电话号码而不是电子邮件地址,电子邮件   字段可能是空的。

希望它会帮助某人:)

答案 6 :(得分:1)

我想用我发现的东西加上这个。对于我的FBSDKGraphRequest,我试图将登录时请求的权限作为字段传递给我。所以我将fields设置为:

"email,user_location"

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

因此,根据您要传递的链接:

"email,location"

希望能帮助别人!

答案 7 :(得分:0)

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