12
votes

I'm developing a social networking app. I've integrated Facebook SDK 3.14 in my iOS App. Now, I want to get the list of all my Facebook friends so I can invite those friends who are not using the app and send friend requests to those friends who have already installed the app.

I can get the list of friends who already use my apps using "/me/friends".

[FBRequestConnection startWithGraphPath:@"/me/friends"
                             parameters:nil
                             HTTPMethod:@"GET"
                      completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                          NSLog(@"All == %@", result);
                      }];

It gives friends' Facebook ids (ex. id = 654330727444458) in response so that I can send friend requests to them.

To get the list of all Facebook friends who have not downloaded the app and if I want to invite those, I need to get all friends using "me/taggable_friends" (Please correct me if I'm wrong).

[FBRequestConnection startWithGraphPath:@"/me/taggable_friends"
                             parameters:nil
                             HTTPMethod:@"GET"
                      completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                          NSlog("%@", result);
                      }];

In the taggable_friends response I'm getting friend's id as id = "AaLYBzZzHdzCmlytqyMAjO0OLDZIOs74Urn93ikeRmmTB3vX_Xl81OYUt4XnoWG0BDLuX67umVkheVdDjzyvm0fcqMqu84GgM9JnNHc-1B63eg" which is friend's token id and it's not unique. I couldn't use it instead, have to use Facebook Id of friend to invite them. Unfortunately, I couldn't get it in the taggable friend response.

4
Yes taggable_friends are wrong because that is meant to tag friends. That is why it is called taggable_friends. Try invitable_friends. But you need to be a canvas game and have a canvas implementation for it. Otherwise I would suggest the Share dialog or Send/Message dialogWizKid
Didn't Facebook change their server so that you can only view friends that are using your app now and not friends who are not using your app?Zhang
@Zhang yes they did it in APIv2 the APIv1 should be supported till 2015 the good question is if Kirit wants to create an app which needs to be rewritten in close future (at least the facebook part of it). In the API v2 there is an endpoint to get the list of friends a user can invite to an app: developers.facebook.com/docs/games/invitable-friends/v2.0 but it is "available for games that have a Facebook Canvas app"fgeorgiew
@Kirit Modi you will try to get facebook friends installed app list ?Darshan Kunjadiya

4 Answers

6
votes

This is only possible on the Facebook API v1 which stops working next April or so. Even now only existing Facebook apps will allow you to use V1 so if you don't have an old enough app you are not able to do this. In V2 you can only get friends who have also signed in to the same app but the user id's are unique to the application to prevent exactly this. I guess Facebook reasons that by doing this is stops people spamming their friends via apps so much :/

As @joelrb says you can create a canvas app for a game and use invitable_friends but FB will vet your "game" so you can't really cheat.

See https://developers.facebook.com/docs/apps/changelog/ for more info.

TLDR; post to wall is all you can do. Tough. Sorry.

4
votes

Use the installed field of a user. Like so:

NSMutableArray *notYetUsers = [NSMutableArray array];
FBRequest *fbRequest = [FBRequest requestForGraphPath:@"me/friends?fields=installed"];
[fbRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    NSAssert(!error, error.localizedDescription);
    NSArray *friends = [(NSDictionary *)result objectForKey:@"data"];
    for (NSDictionary<FBGraphUser> *user in friends) {
        if ([user[@"installed"] isEqual:@(NO)])
            [notYetUsers addObject:user];
    }
}];

notYetUsers would contain all friends who have not installed the app yet.

2
votes
- (void)getFBFriendsWithCompletion:(void (^)(NSError *, id))callback
{        
    NSString *query =  @"select uid, name, is_app_user "
                       @"from user "
                       @"where uid in (select uid2 from friend where uid1=me() )";
    NSDictionary *queryParam =
    [NSDictionary dictionaryWithObjectsAndKeys:query, @"q", nil];
    // Make the API request that uses FQL
    [FBRequestConnection startWithGraphPath:@"/fql"
                                 parameters:queryParam
                                 HTTPMethod:@"GET"
                          completionHandler:^(FBRequestConnection *connection,
                                              id result,
                                              NSError *error) {
                              if (callback)
                                  callback(error, result);
                          }];
}

- (void)foo
{    
    [self getFBFriendsWithCompletion:^(NSError *error, id result) {
       if (!error)
       {
           NSMutableArray *friendsUsingApp = [NSMutableArray array];
           NSMutableArray *friendsNotUsingApp = [NSMutableArray array];

           for (NSDictionary *data in result[@"data"]) {
               if ([data[@"is_app_user"] boolValue] == NO) {
                   [friendsNotUsingApp addObject:data];
               } else {
                   [friendsUsingApp addObject:data];
               }
           }

           // Do something with friendsUsingApp and friendsNotUsingApp
       }
    }];
}
2
votes

taggable_friends refers to a list of friends that can be tagged or mentioned in stories published to Facebook. The result you got is just a tagging token which can only be used in order to tag a friend, and for no other purpose.

Although this refers to a game app, it's easier I think if you use the invitable_friends API. But it requires a Facebook Canvas app implementation. You may just provide a notice in your Canvas for users to just use the mobile app instead, etc.

This is the tutorial that uses invitable_friends API: https://developers.facebook.com/docs/games/mobile/ios-tutorial/

And, the invitable_friends API details: https://developers.facebook.com/docs/games/invitable-friends/v2.0

You can try this to get the IDs of Friends app users:

NSMutableArray *appFriendUsers = [[NSMutableArray alloc] init];

[[FBRequest requestForGraphPath:@"me/friends?fields=installed"]
 startWithCompletionHandler:
 ^(FBRequestConnection *connection,
  NSDictionary *result,
  NSError *error) {

 //if result, no errors
 if (!error && result)
 {
     //result dictionary in key "data"
     NSArray *allFriendsList = [result objectForKey:@"data"];

     if ([allFriendsList count] > 0)
     {
        // Loop
        for (NSDictionary *aFriendData in allFriendsList) {
           // Friend installed app?
           if ([aFriendData objectForKey:@"installed"]) {

              [appFriendUsers addObject: [aFriendData objectForKey:@"id"]];
                 break;
            }
         }
      }
  }
}];