Facebook iOS SDK - 获取好友列表

32

使用Facebook iOS SDK,我该如何获取我的所有好友的NSArray并向他们发送应用邀请?我特别需要获得所有好友的图形路径。

11个回答

74

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

2
你是否请求了 friends_birthday 权限? - C Abernathy
2
终于找到解决方案了 https://dev59.com/3mrWa4cB1Zd3GeqP9U_8 - stack
4
它只返回将使用该应用程序的朋友。但如何获取我的所有在Facebook上的朋友列表? - Satyam
1
这个获取数据是空的,但好友数量是正确的。 - Vineesh TP
4
在最新的Facebook好友SDK中,您无法直接获取好友列表。 - Alok
显示剩余2条评论

14

以下是更完整的解决方案:

在您的头文件中:

@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;
}

您至少需要以下委托协议方法:

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

你正在遍历一个字典吗? - Tudor
1
不,他正在遍历项目,这是一个NSArray。 - Mark Erdmann
1
我们能够获取Facebook好友的电子邮件吗? - booker
我不会说它更完整,但这是使用委托风格的很好的例子。新的带有块的风格则更加容易,以我个人之见。 - Jeff
你如何使用Facebook类型?我导入了这个:#import <FacebookSDK/FacebookSDK.h>,但是那个Facebook数据类型无法识别。 - coolcool1994
我也应该给朋友过生日吗? - Hardik Mamtora

10

获取空白数据 - shweta sharma
1
@shwetasharma,你可能得到空数据是因为你的应用程序没有连接朋友。这只会显示已经在你的应用程序中使用Facebook建立连接的用户朋友。 - dulgan

8
也许这可以帮助您。
[FBRequestConnection startForMyFriendsWithCompletionHandler:
 ^(FBRequestConnection *connection, id<FBGraphUser> friends, NSError *error) 
  { 
     if(!error){
       NSLog(@"results = %@", friends);
     }
  }
];

这只给了我朋友的数量,但没有他们的名字。不知道我错在哪里了。 - Deepak Thakur
'FBGraphUser' 对象有 .name 和 .id 属性。请检查它们。 - John Paul Manoza

3

使用下面的函数异步获取存储在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);
}];

2

// 在头文件中声明一个数组,用于保存所有朋友的列表 - NSMutableArray * m_allFriends;

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

使用 FB SDK 3.0 和 API 版本高于 2.0,您需要调用下面的函数(graph api with me/friends)来获取使用相同应用的 FB 好友列表。

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

-(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)或者您可以更改限制(减少限制、超过25个限制),并将其作为参数传递。
对于非应用好友- m_invitableFriends - 全局数组将保存可邀请好友列表。
另外,要获取非应用好友,您需要使用如下方式:(/me/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];
}

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


                                      }
                                  }];
    }
}

1
使用facebook SDK 3.2或以上,我们可以使用FBWebDialogs类打开一个视图,其中已包含朋友列表。 选择朋友向所有人发送邀请无需使用任何其他API调用。

这里我已经逐步简要描述了解决方案。


0

这是一个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)
    }
}

所以我打印了传入的resultdict并得到以下字符串:{ data = (); summary = { "total_count" = 390; }; }。在我的情况下,数据为空,我正在请求以下权限:"public_profile", "email", "user_friends"。我应该在哪里调用这个功能?在loginViewFetchedUserInfo中吗? - Tom Hert
请注意,自从Graph API 2.0以后,Facebook只会返回已经授权给您的Facebook应用程序的朋友。因此,请确保您有一些已经授权给您的Facebook应用程序的朋友。 - lucaslt89
是的,我理解了。谢谢你的回答! - Tom Hert

0
邀请非应用好友的方法- 你将得到由我/可邀请好友图谱API返回的好友列表和邀请令牌。您可以使用这些邀请令牌和FBWebDialogs向朋友发送邀请,如下所示。
- (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);
                 }
             }
         }
     }];
}

你好,最新的SDK中邀请Facebook好友的功能还能正常使用吗? - Abha
1
@Abha,如果你正在使用iOS的Facebook SDK版本4.0,那么你需要使用FBSDKAppInviteDialog来显示邀请对话框(它将显示一份不可避免的FB好友列表,他们尚未安装你的应用程序)。要实现相同的功能,请参考https://developers.facebook.com/docs/app-invites/ios。 - Sanjay Mohnani

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