Facebook iOS SDK - 在Graph API v2.4中获取好友列表

6
我正在使用以下代码获取使用应用程序的Facebook好友。
// Issue a Facebook Graph API request to get your user's friend list
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                                  initWithGraphPath:@"/{friendlist-id}"
                                  parameters:nil
                                  HTTPMethod:@"GET"];
    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                          id result,
                                          NSError *error) {
        // Handle the result
    }];

但我得到了以下响应。
{
    data =     (
    );
    summary =     {
        "total_count" = 279;
    };
}

我该如何通过使用FBRequest获取类似于上一个API版本中获取的fbID?

请注意,我正在使用最新的FB SDK。

谢谢。


2
代码是正确的。但你只能获取那些可以使用你的应用程序进行 Facebook 登录的朋友列表。 - Dharmesh Dhorajiya
是的,我知道,但我的一些朋友正在使用通过Facebook登录的应用程序。但是,我没有得到我期望从上面的代码返回的fbIDs。 - Muhammad Awais
你和你的朋友都需要授予该应用程序“user_friends”权限,这是否是情况? - CBroe
3个回答

8
根据新的API版本,无法获取好友列表或电子邮件ID,但如果您想显示好友列表,请使用Facebook的TaggableFriend功能。这个可标记的API需要获得Facebook的批准,此API返回id、好友姓名和个人资料图片URL,但id不是FacebookId,而是发布在墙上的id。这是唯一的获得好友列表的方法。但如果您使用me/friends,它会返回应用程序用户的好友总数和好友列表。由于您没有应用程序用户,因此只显示好友总数。要实现此功能,您必须使用管理帐户(创建Facebook ID的帐户)登录,并实施分页概念。请使用以下代码片段:"/me/taggable_friends?fields=id,name,picture.type(large)。"

这就是我一直在寻找的!谢谢。 - Javier Roberto
但是如何获得Facebook的批准,我正在尝试但没有成功。请帮帮我。 - Rahul Sinha

4
您可以通过以下方式获取好友列表和其他详细信息:

像这样:

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
#import <FBSDKShareKit/FBSDKShareKit.h>

自定义 Facebook 按钮点击:

- (IBAction)facebook_click:(id)sender
{
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];

    [login logInWithReadPermissions:@[@"public_profile", @"email", @"user_friends"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
     {
         if (error)
         {
             // Process error
             NSLog(@"error is :%@",error);
         }
         else if (result.isCancelled)
         {
             // Handle cancellations
             NSLog(@"error is :%@",error);
         }
         else
         {
             if ([result.grantedPermissions containsObject:@"email"])
             {
                 NSLog(@"Login successfull");
                 [self fetchUserInfo];
                 [login logOut];
             }
         }
     }];
}

请求的响应:

-(void)fetchUserInfo
{
    if ([FBSDKAccessToken currentAccessToken])
    {
        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id,name,link,first_name, last_name, picture.type(large), email, birthday,friends,gender,age_range,cover"}]
         startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
             if (!error)
             {
                 //NSLog(@"result is :%@",result);
                 NSLog(@"User ID : %@",[result valueForKey:@"id"]);
                 NSLog(@"User Name : %@",[result valueForKey:@"name"]);
                 NSLog(@"User First Name :%@",[result valueForKey:@"first_name"]);
                 NSLog(@"User Last Name :%@",[result valueForKey:@"last_name"]);
                 NSLog(@"USER Email is :%@",[result valueForKey:@"email"]);
                 NSLog(@"User fb_Link : %@",[result valueForKey:@"link"]);
                 NSLog(@"User Birthday : %@",[result valueForKey:@"birthday"]);
                 NSLog(@"FB Profile Photo Link :%@",[[[result valueForKey:@"picture"]objectForKey:@"data"]objectForKey:@"url"]);
                 NSLog(@"User total friends : %@",[[[result valueForKey:@"friends"]objectForKey:@"summary"]valueForKey:@"total_count"]);
                 NSLog(@"User Gender : %@",[result valueForKey:@"gender"]);
                 NSLog(@"User age_range : %@",[[result valueForKey:@"age_range"]objectForKey:@"min"]);
                 NSLog(@"User cover Photo Link : %@",[[result valueForKey:@"cover"]objectForKey:@"source"]);

                 //Friend List ID And Name
                 NSArray * allKeys = [[result valueForKey:@"friends"]objectForKey:@"data"];

                 fb_friend_Name = [[NSMutableArray alloc]init];
                 fb_friend_id  =  [[NSMutableArray alloc]init];

                 for (int i=0; i<[allKeys count]; i++)
                 {
                     [fb_friend_Name addObject:[[[[result valueForKey:@"friends"]objectForKey:@"data"] objectAtIndex:i] valueForKey:@"name"]];

                     [fb_friend_id addObject:[[[[result valueForKey:@"friends"]objectForKey:@"data"] objectAtIndex:i] valueForKey:@"id"]];

                 }
                 NSLog(@"Friends ID : %@",fb_friend_id);
                 NSLog(@"Friends Name : %@",fb_friend_Name);
             }
         }];
    }
}

你可以使用这个API获取好友的个人资料图片。
NSString *str = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture?type=large",friend_id];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:str]];
UIImage *profilePic = [UIImage imageWithData:imageData];

注意:它只会显示那些下载了你的应用的朋友列表,而不是你Facebook朋友的所有朋友。根据新的API版本,无法获取朋友列表或朋友的电子邮件ID。

好友和好友列表不存在。Facebook错误:code = 100; “fbtrace_id” = Eik7oS4zQRt; message = “(#100) 未知字段:friens,friendlist。”; type = OAuthException; - Ricardo
我能同时获取好友的头像吗? - Niharika
@Niharika,我已经编辑了我的答案,请检查一下。你可以使用这个API获取朋友的个人资料图片。 :) - sohil

4

您需要在登录时添加user_friends权限。

要查看任何人的好友列表,需要使用带有user_friends权限的用户访问令牌。

您只能获取安装了相同应用程序的好友。

仅返回安装了此应用程序的好友,API v2.0及更高版本中的总计数(total_count)表示所有好友的总数,包括未安装该应用程序的好友。

FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                              initWithGraphPath:@"me/friends"
                              parameters:nil
                              HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                      id result,
                                      NSError *error) {
    // Handle the result
}];

1
非常感谢,但这不是我需要的... 我只想要使用相同应用程序的Facebook好友的fbID(应用程序范围相同)。 - Muhammad Awais
是的,我正在为此添加权限,并且仍然得到相同的响应,即总好友数量,但没有fbID,但无论如何,这个答案必须是可接受的。logInViewController.facebookPermissions = [[NSArray alloc] initWithObjects:@"public_profile", @"user_friends", nil]; - Muhammad Awais
没有数据,意味着你的朋友没有安装该应用程序。 - Kirit Modi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接