Facebook iOS SDK-liste d'amis
en utilisant le SDK iOS Facebook, Comment puis-je obtenir un NSArray
de tous mes amis et leur envoyer une invitation à mon application? Je cherche spécifiquement le chemin du graphique pour obtenir tous les amis.
11 réponses
avec Facebook SDK 3.0 vous pouvez faire ceci:
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);
}
}];
Voici une solution plus complète:
dans votre fichier d'en-tête:
@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
puis dans votre implémentation:
@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;
}
alors vous avez besoin au moins de la méthode de protocole de délégué suivante:
- (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);
}
}
pour obtenir la liste d'amis vous pouvez utiliser
https://graph.facebook.com/me/friends
[facebook requestWithGraphPath:@"me/friends"
andParams:nil
andDelegate:self];
pour en savoir plus sur toutes les API possibles, lire
peut-être que cela pourrait aider
[FBRequestConnection startForMyFriendsWithCompletionHandler:
^(FBRequestConnection *connection, id<FBGraphUser> friends, NSError *error)
{
if(!error){
NSLog(@"results = %@", friends);
}
}
];
utilisez la fonction ci-dessous pour récupérer de manière asynchrone les amis de l'utilisateur stockés dans un 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);
}];
}
dans votre code, vous pouvez l'utiliser comme tel:
[self fetchFriends:^(NSArray *friends) {
NSLog(@"%@", friends);
}];
// déclaration d'un tableau dans l'en-tête de fichier qui va contenir la liste de tous les amis - NSMutableArray * m_allFriends;
/ / alloc et initialiser le tableau une seule fois m_allFriends = [[NSMutableArray alloc] init];
avec FB SDK 3.0 et la Version API ci-dessus 2.0, vous devez appeler la fonction ci-dessous (api graphique avec moi/amis)pour obtenir la liste des amis FB qui utilise la même application.
// demandez à vos amis qui utilisent l'application
-(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) la limite par défaut pour le nombre d'amis retournés par la requête ci-dessus est de 25. 2) si le lien suivant apparaît, cela signifie qu'il y a d'autres amis que vous allez chercher dans la requête suivante et ainsi de suite. 3)vous pouvez modifier la limite (réduire la limite, dépasser la limite de 25) et le passer en param.
////////////////////////////////////////////////////////////////////////
pour les amis non app -
// m_invitableFriends - global tableau qui va contenir la liste des invitable amis
aussi pour obtenir des amis non app vous devez utiliser (/me / invitable_friends) comme ci-dessous -
- (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];
}
Avec facebook SDK 3.2 or above
nous avons une installation de FBWebDialogs
classe qui ouvre une vue qui contient déjà les ami(e) s de la liste. Pick the friends
et send invitations to all of them
. pas besoin d'utiliser d'appels API supplémentaires.
Ici j'ai brièvement décrit la résolution de l'étape-par-étape.
(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");
}
}];
}
}];
}
}
Voici une version 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)
}
}
Pour Inviter les app ami -
vous obtiendrez des jetons d'invitation avec la liste des amis retournés par l'api me/invitable_friends graph. Vous pouvez utiliser ces jetons d'invitation avec FBWebDialogs pour envoyer des invitations à des amis comme ci-dessous
- (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
}
}];
}