目标c - Facebook iOS SDK -获取好友列表



使用Facebook iOS SDK,我如何获得所有好友的NSArray并向他们发送邀请到我的应用程序?我特别寻找图形路径来获得所有的朋友。

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

这里有一个更完整的解决方案:

头文件:

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

获取好友列表,可以使用

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

使用下面的函数异步获取存储在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和API版本2.0以上,你需要调用下面的函数(图形API与我/朋友),以获得使用相同应用程序的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];
}

与facebook SDK 3.2 or above,我们有一个设施的FBWebDialogs类,打开一个视图,其中已经包含的朋友(s)列表。Pick the friendssend invitations to all of them

这里我已经一步一步简要地描述了分辨率

(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_friends图形api返回的朋友列表。您可以使用这些邀请令牌与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
                              }
                          }];
}

相关内容

  • 没有找到相关文章

最新更新