Как получить список друзей Facebook, которые не установили приложение?

Я разрабатываю приложение для социальных сетей. Я включил Facebook SDK 3.14 в мое приложение для iOS. Теперь я хочу получить список всех своих друзей в Facebook, чтобы я мог приглашать тех друзей, которые не используют приложение, и отправлять запросы друзьям тем, кто уже установил приложение.

Я могу получить список друзей, которые уже используют мои приложения, используя "/me/friends".

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

В ответ он дает идентификаторы Facebook (например, id = 654330727444458), чтобы я мог отправлять им запросы друзей.

Чтобы получить список всех друзей Facebook, которые не загрузили приложение, и если я хочу их пригласить, мне нужно, чтобы все друзья использовали "me/taggable_friends" (Пожалуйста, поправьте меня, если я ошибаюсь).

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

В ответе taggable_friends я получаю идентификатор друга как id = "AaLYBzZzHdzCmlytqyMAjO0OLDZIOs74Urn93ikeRmmTB3vX_Xl81OYUt4XnoWG0BDLuX67umVkheVdDjzyvm0fcqMqu84GgM9JnNHc-1B63eg ", который является идентификатором идентификатора друга, и он не уникален. Я не мог использовать его вместо этого, должен использовать Facebook-идентификатор друга, чтобы пригласить их., Я не смог бы получить его в ответе с ответом.

Ответ 1

Это возможно только в Facebook API v1, который перестает работать в следующем апреле или около того. Даже сейчас только существующие приложения Facebook позволят вам использовать V1, поэтому, если у вас нет достаточно старого приложения, вы не сможете этого сделать. В V2 вы можете получать только друзей, которые также вошли в одно приложение, но идентификатор пользователя уникален для приложения, чтобы это точно предотвратить. Думаю, что Facebook объясняет, что, делая это, люди перестают спамить своих друзей с помощью приложений:/

Как @joelrb говорит, что вы можете создать приложение для холста для игры и использовать invitable_friends, но FB проверит вашу "игру", чтобы вы не могли обмануть.

Подробнее см. https://developers.facebook.com/docs/apps/changelog/.

TL;DR; сообщение на стену - это все, что вы можете сделать. Tough. К сожалению.

Ответ 2

Используйте поле installed для user. Например:

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 будет содержать всех друзей, которые еще не установили приложение.

Ответ 3

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

Ответ 4

taggable_friends относится к списку друзей, которые могут быть помечены или упомянуты в рассказах, опубликованных в Facebook. Полученный результат - это только токен тегирования, который можно использовать только для того, чтобы пометить друга и ни для чего другого.

Хотя это относится к игровому приложению, мне проще, если вы используете API invitable_friends. Но для этого требуется реализация приложения Facebook Canvas. Вы можете просто предоставить уведомление в своем Canvas, чтобы пользователи могли просто использовать мобильное приложение и т.д.

Это учебное пособие, в котором используется API invitable_friends: https://developers.facebook.com/docs/games/mobile/ios-tutorial/

И сведения о invitable_friends: https://developers.facebook.com/docs/games/invitable-friends/v2.0

Вы можете попробовать это, чтобы получить идентификаторы пользователей приложений друзей:

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