Verificación iOS facebook si los amigos tienen instalada la aplicación

¿Ya hay una forma con la API de facebook ios para get una list de amigos que tienen instalada tu aplicación? Básicamente necesito algo similar a "Palabras con amigos" donde pueden determinar cuáles de tus amigos de FB están jugando el juego. Tengo una solución que requiere un uso extra de la database, pero esperaba que el FB api tuviera algo incorporado para este tipo de consulta.

Cree una class de delegado FBFriendPickerDelegate y anule esta function:

 -(BOOL)friendPickerViewController:(FBFriendPickerViewController *)friendPicker shouldIncludeUser:(id<FBGraphUser>)user{ BOOL installed = [user objectForKey:@"installed"] != nil; return installed; } 

Para los usuarios que no tienen su aplicación instalada, el campo installed será nil , pero debe solicitarlo cuando cargue datos:

 self.friendsController = [[FBFriendPickerViewController alloc] initWithNibName:nil bundle:nil]; //... NSSet *fields = [NSSet setWithObjects:@"installed", nil]; self.friendPickerController.fieldsForRequest = fields; //... [self.friendsController loadData]; 

Creo que fql es un poco complejo para mí, por lo que utilizo esta function en FBRequest para llamar a Graph API para resolver este problema en Facebook SDK 3.5

 + (FBRequest *)requestWithGraphPath:(NSString*)graphPath parameters:(NSDictionary*)parameters HTTPMethod:(NSString*)HTTPMethod; 

Y el código es:

 FBRequest *request = [FBRequest requestWithGraphPath:@"me/friends" parameters:@{@"fields":@"name,installed,first_name"} HTTPMethod:@"GET"]; [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error){ }]; 

Puedes poner todos tus campos interesantes en el dictionary de parameters. Y de acuerdo con la Referencia de SDK, el object que contiene el tipo (siempre es "usuario"), id (el ID del usuario) y el campo opcional instalado (siempre es cierto si se devuelve); El campo instalado solo se devuelve si el usuario ha instalado la aplicación, de lo contrario no es parte del object devuelto

He usado este código en el pasado para get una aplicación con amigos de un usuario.

facebook es la class de Facebook que viene con FB Connect.

 NSString *fql = [NSString stringWithFormat:@"SELECT name,uid, pic_small FROM user WHERE is_app_user = 1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = %@) order by concat(first_name,last_name) asc",userId,userId]]; NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:fql ,@"query", [facebook accessToken], @"access_token", nil]; [facebook requestWithMethodName:@"fql.query" andParams:params andHttpMethod:@"GET" andDelegate:self]; 

La solución más fácil es usar el

 - (BOOL)friendPickerViewController: shouldIncludeUser: 

método implementado por el protocolo FBFriendPickerDelegate en el último SDK de Facebook de 3.5.1 (junio de 2013), preguntando al delegado si debe include a un amigo en la list, según el campo "instalado" al searchme a mí / a mis amigos.

El campo instalado está presente (verdadero) si el amigo también es un usuario de la aplicación que llama.

Puedes usar así:

 - (BOOL)friendPickerViewController:(FBFriendPickerViewController *)friendPicker shouldIncludeUser:(id <FBGraphUser>)user { return [[user objectForKey:@"installed"] boolValue]; } 

¡IMPORTANTE! Debe include los siguientes para include el campo en la request e informar a friendPicker sobre su delegado:

  self.fieldsForRequest = [NSSet setWithObject:@"installed"]; self.delegate = self; 

Puede verificar con Graph Api Explorer que solo los amigos con las aplicaciones instaladas se muestran utilizando Graph API Explorer e ingresando la consulta

me / friends? fields = instalado

y puedes recuperar una list de tus amigos así, donde uno de los usuarios ha instalado tu aplicación (verdadero):

 ... { "id": "100002656xxxxxx" }, { "installed": true, "id": "100004366xxxxxx" }, ...