在iOS中获取Facebook好友列表

时间:2016-03-23 19:55:11

标签: ios facebook facebook-graph-api

我想在我的应用程序中获取名称,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登录并获取我的个人资料。之后,我试图通过朋友图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等?如果已经实施了任何一个,请帮助我。谢谢。

2 个答案:

答案 0 :(得分: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);
    }];
}

答案 1 :(得分:0)

result.paging.next包含完整的网址,包含访问令牌和所有内容。我发现最简单的事情就是将其传递给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