Facebook的iOS SDK – 获取朋友列表

使用Facebook iOS SDK,我怎样才能获得所有朋友的NSArray ,并向他们发送一个邀请给我的应用程序? 我正在寻找图表path来获得所有的朋友。

使用Facebook SDK 3.0,您可以这样做:

 FBRequest* friendsRequest = [FBRequest requestForMyFriends]; [friendsRequest startWithCompletionHandler: ^(FBRequestConnection *connection, NSDictionary* result, NSError *error) { NSArray* friends = [result objectForKey:@"data"]; NSLog(@"Found: %lu friends", (unsigned long)friends.count); for (NSDictionary<FBGraphUser>* friend in friends) { NSLog(@"I have a friend named %@ with id %@", friend.name, friend.objectID); } }]; 

这是一个更完整的解决scheme:

在你的头文件中:

 @interface myDelegate : NSObject <UIApplicationDelegate, FBSessionDelegate, FBRequestDelegate> { Facebook *facebook; UIWindow *window; UINavigationController *navigationController; NSArray *items; // to get facebook friends } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; @property (nonatomic, retain) Facebook *facebook; @property (nonatomic, retain) NSArray *items; @end 

然后在你的实现中:

 @implementation myDelegate @synthesize window; @synthesize navigationController; @synthesize facebook; @synthesize items; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID_FROM_FACEBOOK" andDelegate:self]; [facebook requestWithGraphPath:@"me/friends" andDelegate:self]; return YES; } 

那么你至less需要下面的委托协议方法:

 - (void)request:(FBRequest *)request didLoad:(id)result { //ok so it's a dictionary with one element (key="data"), which is an array of dictionaries, each with "name" and "id" keys items = [[(NSDictionary *)result objectForKey:@"data"]retain]; for (int i=0; i<[items count]; i++) { NSDictionary *friend = [items objectAtIndex:i]; long long fbid = [[friend objectForKey:@"id"]longLongValue]; NSString *name = [friend objectForKey:@"name"]; NSLog(@"id: %lld - Name: %@", fbid, name); } } 

要获得可以使用的朋友列表

https://graph.facebook.com/me/friends

 [facebook requestWithGraphPath:@"me/friends" andParams:nil andDelegate:self]; 

要详细了解所有可能的API,请阅读

https://developers.facebook.com/docs/reference/api/

也许这可能有帮助

 [FBRequestConnection startForMyFriendsWithCompletionHandler: ^(FBRequestConnection *connection, id<FBGraphUser> friends, NSError *error) { if(!error){ NSLog(@"results = %@", friends); } } ]; 

使用下面的函数asynchronous获取存储在NSArray中的用户朋友:

 - (void)fetchFriends:(void(^)(NSArray *friends))callback { [FBRequestConnection startForMyFriendsWithCompletionHandler:^(FBRequestConnection *connection, id response, NSError *error) { NSMutableArray *friends = [NSMutableArray new]; if (!error) { [friends addObjectsFromArray:(NSArray*)[response data]]; } callback(friends); }]; } 

在你的代码中,你可以像这样使用它:

 [self fetchFriends:^(NSArray *friends) { NSLog(@"%@", friends); }]; 

//在头文件中声明一个数组,它将包含所有朋友的列表 – NSMutableArray * m_allFriends;

//只分配和初始化数组一次m_allFriends = [[NSMutableArray alloc] init];

使用FB SDK 3.0和2.0以上的API版本,你需要调用下面的函数(与我/朋友图api)来获取使用同一个应用程序的FB Friends列表。

//获取使用该应用的朋友

 -(void) getMineFriends { [FBRequestConnection startWithGraphPath:@"me/friends" parameters:nil HTTPMethod:@"GET" completionHandler:^( FBRequestConnection *connection, id result, NSError *error ) { NSLog(@"me/friends result=%@",result); NSLog(@"me/friends error = %@", error.description); NSArray *friendList = [result objectForKey:@"data"]; [m_allFriends addObjectsFromArray: friendList]; }]; } 

注意:1)上述查询返回的朋友数的默认限制是25个。2)如果下一个链接出现,这意味着有更多的朋友将在下一个查询中提取,等等。 3)或者你可以改变限制(减less限制,超过限制从25),并通过参数。

////////////////////////////////////////////////// //////////////////////

对于非应用程序朋友 –

// m_invitableFriends – 全局数组,它将包含可邀请的朋友列表

也要获得非应用程序的朋友,你需要使用(/我/ invitable_friends)如下 –

 - (void) getAllInvitableFriends { NSMutableArray *tempFriendsList = [[NSMutableArray alloc] init]; NSDictionary *limitParam = [NSDictionary dictionaryWithObjectsAndKeys:@"100", @"limit", nil]; [self getAllInvitableFriendsFromFB:limitParam addInList:tempFriendsList]; } - (void) getAllInvitableFriendsFromFB:(NSDictionary*)parameters addInList:(NSMutableArray *)tempFriendsList { [FBRequestConnection startWithGraphPath:@"/me/invitable_friends" parameters:parameters HTTPMethod:@"GET" completionHandler:^( FBRequestConnection *connection, id result, NSError *error ) { NSLog(@"error=%@",error); NSLog(@"result=%@",result); NSArray *friendArray = [result objectForKey:@"data"]; [tempFriendsList addObjectsFromArray:friendArray]; NSDictionary *paging = [result objectForKey:@"paging"]; NSString *next = nil; next = [paging objectForKey:@"next"]; if(next != nil) { NSDictionary *cursor = [paging objectForKey:@"cursors"]; NSString *after = [cursor objectForKey:@"after"]; //NSString *before = [cursor objectForKey:@"before"]; NSDictionary *limitParam = [NSDictionary dictionaryWithObjectsAndKeys: @"100", @"limit", after, @"after" , nil ]; [self getAllInvitableFriendsFromFB:limitParam addInList:tempFriendsList]; } else { [self replaceGlobalListWithRecentData:tempFriendsList]; } }]; } - (void) replaceGlobalListWithRecentData:(NSMutableArray *)tempFriendsList { // replace global from received list [m_invitableFriends removeAllObjects]; [m_invitableFriends addObjectsFromArray:tempFriendsList]; //NSLog(@"friendsList = %d", [m_invitableFriends count]); [tempFriendsList release]; } 

使用facebook SDK 3.2 or above我们有一个FBWebDialogs类的工具,它打开一个已经包含朋友列表的视图。 Pick the friendssend invitations to all of them不需要使用任何额外的API调用。

在这里,我已经一步一步简要介绍了这个解决scheme。

 (void)getFriendsListWithCompleteBlock:(void (^)(NSArray *, NSString *))completed{ if (!FBSession.activeSession.isOpen) { NSLog(@"permissions::%@",FBSession.activeSession.permissions); // if the session is closed, then we open it here, and establish a handler for state changes [FBSession openActiveSessionWithReadPermissions:@[@"basic_info", @"user_friends"] allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { if (error) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; } else if (session.isOpen) { [self showWithStatus:@""]; FBRequest *friendRequest = [FBRequest requestForGraphPath:@"me/friends?fields=name,picture,gender"]; [friendRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { NSArray *data = [result objectForKey:@"data"]; NSMutableArray *friendsList = [[NSMutableArray alloc] init]; for (FBGraphObject<FBGraphUser> *friend in data) { //NSLog(@"friend:%@", friend); NSDictionary *picture = [friend objectForKey:@"picture"]; NSDictionary *pictureData = [picture objectForKey:@"data"]; //NSLog(@"picture:%@", picture); FBData *fb = [[FBData alloc] initWithData:(NSString*)[friend objectForKey:@"name"] userID:(NSInteger)[[friend objectForKey:@"id"] integerValue] gender:(NSString*)[friend objectForKey:@"gender"] photoURL:(NSString*)[pictureData objectForKey:@"url"] photo:(UIImage*)nil isPhotoDownloaded:(BOOL)NO]; [friendsList addObject:fb]; } [self dismissStatus]; if (completed) { completed(friendsList,@"I got it"); } }]; } }]; } } 

这是一个Swift版本。

 var friendsRequest : FBRequest = FBRequest.requestForMyFriends() friendsRequest.startWithCompletionHandler{(connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in let resultdict = result as NSDictionary let friends : NSArray = resultdict.objectForKey("data") as NSArray println("Found: \(friends.count) friends") for friend in friends { let id = friend.objectForKey("id") as String println("I have a friend named \(friend.name) with id " + id) } } 

邀请非应用程序的朋友 –

你会得到邀请令牌与我返回的朋友列表/ invitable_friendsgraphicsapi。 您可以使用这些带FBWebDialog的邀请令牌向以下朋友发送邀请

 - (void) openFacebookFeedDialogForFriend:(NSString *)userInviteTokens { NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: userInviteTokens, @"to", nil, @"object_id", @"send", @"action_type", actionLinksStr, @"actions", nil]; [FBWebDialogs presentRequestsDialogModallyWithSession:nil message:@"Hi friend, I am playing game. Come and play this awesome game with me." title:nil parameters:params handler:^( FBWebDialogResult result, NSURL *url, NSError *error) { if (error) { // Error launching the dialog or sending the request. NSLog(@"Error sending request : %@", error.description); } else { if (result == FBWebDialogResultDialogNotCompleted) { // User clicked the "x" icon NSLog(@"User canceled request."); NSLog(@"Friend post dialog not complete, error: %@", error.description); } else { NSDictionary *resultParams = [g_mainApp->m_appDelegate parseURLParams:[url query]]; if (![resultParams valueForKey:@"request"]) { // User clicked the Cancel button NSLog(@"User canceled request."); } else { NSString *requestID = [resultParams valueForKey:@"request"]; // here you will get the fb id of the friend you invited, // you can use this id to reward the sender when receiver accepts the request NSLog(@"Feed post ID: %@", requestID); NSLog(@"Friend post dialog complete: %@", url); } } } }]; } 
 -(void)getFBFriends{ NSDictionary *queryParam = [NSDictionary dictionaryWithObjectsAndKeys:@"SELECT uid, sex,name,hometown_location,birthday, pic_square,pic_big FROM user WHERE uid = me()" @"OR uid IN (SELECT uid2 FROM friend WHERE uid1 = me())", @"q", nil]; // Make the API request that uses FQL [FBRequestConnection startWithGraphPath:@"/fql" parameters:queryParam HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { if (error) { NSLog(@"Error: %@", [error localizedDescription]); } else { NSDictionary *data=result; //NSLog(@"the returned data of user is %@",data); NSArray *dataArray=[data objectForKey:@"data"]; //dataArray contains first user as self user and your friend list } }]; }