在 iOS 中获取 Facebook 好友列表

Posted

技术标签:

【中文标题】在 iOS 中获取 Facebook 好友列表【英文标题】:Get Facebook Friend List in iOS 【发布时间】:2016-03-23 19:55:11 【问题描述】:

我正在尝试在我的应用中获取包含姓名、ID 等的 Facebook 好友列表。

- (IBAction)onFBLogin:(id)sender 
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
    [login
     logInWithReadPermissions: @[@"public_profile", @"email", @"user_friends"]
     fromViewController:self
     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) 
         if (error) 
             NSLog(@"Process error");
          else if (result.isCancelled) 
             NSLog(@"Cancelled");
          else 
             NSLog(@"%@", result);
             [self getFBEmailAddress];
        
     ];

-(void)getFBEmailAddress
    [[[FBSDKGraphRequest alloc] initWithGraphpath:@"me"
                                       parameters:@@"fields": @"picture, email, friends"]
     startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
         if (!error) 
             NSString *pictureURL = [NSString stringWithFormat:@"%@",[result objectForKey:@"picture"]];
             mFBId = [NSString stringWithFormat:@"%@",[result objectForKey:@"id"]];
             NSLog(@"My Profile : %@", result);
             NSLog(@"email is %@", [result objectForKey:@"email"]);

             [self getFBFriendList];
         
         else
             NSLog(@"%@", [error localizedDescription]);
         
     ];

-(void)getFBFriendList

    NSString* graphPat = [[NSString alloc] initWithFormat:@"%@/friends", mFBId];

    FBSDKGraphRequest *requestFriends = [[FBSDKGraphRequest alloc]
                                         initWithGraphPath:graphPat
                                         parameters:@@"fields": @"id, name"
                                         HTTPMethod:@"GET"];
    [requestFriends startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                                 id result,
                                                 NSError *error) 
        if (!error && result)
        
            NSArray *allFriendsResultData = [result objectForKey:@"data"];

            if ([allFriendsResultData count] > 0)
            
                for (NSDictionary *friendObject in allFriendsResultData)
                
                    NSString *friendName = [friendObject objectForKey:@"name"];
                    NSString *friendID = [friendObject objectForKey:@"id"];
                    NSLog(@"%@ : %@", friendID, friendName);

                
            
        

    ];

我已成功通过 Facebook 登录并获取我的个人资料。之后,我尝试通过friends graph api获取朋友列表。但当时只表示关注的朋友数如下。

    friends =     
        data =         (
        );
        summary =         
            "total_count" = 2;
        ;
    ;
    id = 60XXXXXX1295X;
    picture =     
        data =         
            "is_silhouette" = 0;
            url = "https://scontent.xx.fbcdn.net/hprofile-xfa1/v/t1.0-1/p50x50/1..._501957533...";
        ;
    ;

如何获取好友列表的完整信息,例如 id、name 等?如果有人已经实施,请帮助我。谢谢。

【问题讨论】:

请告诉我如何解决这个问题。 【参考方案1】:

这对我有用。

NSMutableArray *completeList = [[NSMutableArray alloc] init];
[self fetchFacebookEachFriend:completeList withGrapPath:@"/me/friends" withCallback:^(BOOL success, NSMutableArray * fbList) 
     //Finish get All Friends
     fbListFinal(success, fbList);
];


- (void)fetchFacebookEachFriend:(NSMutableArray *)completeList withGrapPath:(NSString *)graphPath withCallback:(returnFbList)fbList

    NSDictionary *limitDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"first_name, last_name, middle_name, name, email", @"fields", nil];
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath parameters:limitDictionary HTTPMethod:@"GET"];
    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
        if (error) 
            [[[UIAlertView alloc] initWithTitle:@"Alert!" message:@"Please connect to Facebook to find your friends" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
            fbList(NO, completeList);
            return;
        

        //Add each friend to list
        for (NSDictionary *friend in [result valueForKey:@"data"]) 
            [completeList addObject:friend];
        

        if ([result valueForKey:@"paging"] != nil && [[result valueForKey:@"paging"] valueForKey:@"next"] != nil) 
            NSString *nextPage = [[result valueForKey:@"paging"] valueForKey:@"next"];
            nextPage = [[nextPage componentsSeparatedByString:@"?"] objectAtIndex:1];
            [self fetchFacebookEachFriend:completeList withGrapPath:[NSString stringWithFormat:@"me/friends?%@",nextPage] withCallback:fbList];
         else
            fbList(YES, completeList);
    ];

【讨论】:

【参考方案2】:

result.paging.next 包含完整的 URL,包括访问令牌和所有内容。我发现最简单的方法就是将其传递给 NSURLSession 数据任务:

NSString *nextPage = result[@"paging"][@"next"];
if (!nextPage) return;
[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:nextPage] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) 
    id json = [self decodeJSONResult:data response:response error:error];
    // use json
] resume];

我将其写为FBSDKGraphRequest 扩展名:FBSDKGraphRequest+Paging.h

【讨论】:

以上是关于在 iOS 中获取 Facebook 好友列表的主要内容,如果未能解决你的问题,请参考以下文章

Facebook SDK 错误 Domain=com.facebook.sdk Code=5 在 ios 中获取好友列表时

如何使用 FBSDK for iOS 获取 Facebook 好友列表?

如何从 Facebook iOS sdk 获取好友列表

iOS Facebook 获取好友列表

如何使用 iOS Facebook SDK 获取所有 Facebook 好友列表

在 iOS 中获取 Facebook 好友时出错