在iOS中获取Facebook好友列表

我想在我的应用程序中获取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); } } } }];} 

我已经成功通过Facebooklogin,并获得我的个人资料。 之后,我试图通过朋友图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,姓名等? 如果有任何一个已经实施,请帮助我。 谢谢。

这为我工作。

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

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