Facebook iOS SDK - get friends list

后端 未结 11 1440
猫巷女王i
猫巷女王i 2020-12-07 12:41

Using the Facebook iOS SDK, how can I get an NSArray of all my friends and send them an invitation to my app? I am specifically looking for the graph path to ge

相关标签:
11条回答
  • 2020-12-07 12:47
    (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");
                                                      }
                                                  }];
    
    
                                          }
                                      }];
        }
    }
    
    0 讨论(0)
  • 2020-12-07 12:50

    For Inviting non app friend -

    you will get invite tokens with the list of friends returned by me/invitable_friends graph api. You can use these invite tokens with FBWebDialogs to send invite to friends as below

    - (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);
                     }
                 }
             }
         }];
    }
    
    0 讨论(0)
  • 2020-12-07 12:51

    Here is a Swift Version.

    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)
        }
    }
    
    0 讨论(0)
  • 2020-12-07 12:54
    -(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
    
                                  }
                              }];
    }
    
    0 讨论(0)
  • 2020-12-07 12:58

    // declare an array in header file which will hold the list of all friends - NSMutableArray * m_allFriends;

    // alloc and initialize the array only once m_allFriends = [[NSMutableArray alloc] init];

    With FB SDK 3.0 and API Version above 2.0 you need to call below function (graph api with me/friends)to get list of FB Friends which uses the same app.

    // get friends which use the app

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

    Note : 1) The default limit for the number of friends returned by above query is 25. 2)If the next link comes in result, that means there are some more friends which you will be fetching in next query and so on. 3)Alternatively you can change the limit (reduce the limit, exceed the limit from 25) and pass that in param.

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

    For non app friends -

    // m_invitableFriends - global array which will hold the list of invitable friends

    Also to get non app friends you need to use (/me/invitable_friends) as below -

    - (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];
    }
    
    0 讨论(0)
  • 2020-12-07 12:59

    With Facebook SDK 3.0 you can do this:

    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);
        }
    }];
    
    0 讨论(0)
提交回复
热议问题