Wie kann ich mithilfe des Facebook iOS SDK eine NSArray
aller meiner Freunde erhalten und ihnen eine Einladung zu meiner App senden? Ich suche speziell nach dem Diagrammpfad, um alle Freunde zu finden.
Mit Facebook SDK 3.0 können Sie Folgendes tun:
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);
}
}];
Hier ist eine vollständigere Lösung:
In Ihrer Headerdatei:
@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
Dann in Ihrer Implementierung:
@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;
}
Dann benötigen Sie mindestens die folgende Delegate-Protokollmethode:
- (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);
}
}
Um eine Liste von Freunden zu erhalten, können Sie verwenden
https://graph.facebook.com/me/friends
[facebook requestWithGraphPath:@"me/friends"
andParams:nil
andDelegate:self];
Um mehr über alle möglichen APIs zu erfahren, lesen Sie bitte
Vielleicht könnte das helfen
[FBRequestConnection startForMyFriendsWithCompletionHandler:
^(FBRequestConnection *connection, id<FBGraphUser> friends, NSError *error)
{
if(!error){
NSLog(@"results = %@", friends);
}
}
];
Verwenden Sie die unten stehende Funktion, um in einem NSArray gespeicherte Freunde des Benutzers asynchron abzurufen:
- (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);
}];
}
In Ihrem Code können Sie es als solches verwenden:
[self fetchFriends:^(NSArray *friends) {
NSLog(@"%@", friends);
}];
// deklariere ein Array in der Header-Datei, das die Liste aller Freunde enthält - NSMutableArray * m_allFriends;
// das Array nur einmal zuordnen und initialisieren m_allFriends = [[NSMutableArray Allocation] init];
Mit dem FB SDK 3.0 und der API-Version über 2.0 müssen Sie unterhalb der Funktion (Grafik API mit mir/Freunden) aufrufen, um eine Liste der FB-Freunde zu erhalten, die dieselbe App verwenden.
// Freunde finden, die die App nutzen
-(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];
}];
}
Hinweis: 1) Das Standardlimit für die Anzahl der Freunde, die von der obigen Abfrage zurückgegeben werden, ist 25. 2) Wenn der nächste Link zu dem Ergebnis führt, gibt es einige weitere Freunde, die Sie bei der nächsten Abfrage abrufen werden usw. . 3) Alternativ können Sie den Grenzwert ändern (Grenzwert verringern, Grenzwert von 25 überschreiten) und den Parameter in Parameter übergeben.
//////////////////////////////////////////// //////////////////////
Für Nicht-App-Freunde -
// m_invitableFriends - globales Array, das die Liste der einladbaren Freunde enthält
Um auch Nicht-App-Freunde zu erhalten, müssen Sie (/ me/invitable_friends) wie folgt verwenden:
- (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];
}
Mit facebook SDK 3.2 or above
verfügen wir über eine Funktion der Klasse FBWebDialogs
, die eine Ansicht öffnet, die bereits die Freundesliste enthält. Pick the friends
und send invitations to all of them
. Es müssen keine zusätzlichen API-Aufrufe verwendet werden.
Hier Ich habe die Auflösung Schritt für Schritt kurz beschrieben.
(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");
}
}];
}
}];
}
}
Für das Einladen eines Nicht-App-Freundes -
sie erhalten Einladungsmarken mit der Liste der von mir zurückgegebenen Freunde/invitable_friends graph api. Sie können diese Einladungstoken mit FBWebDialogs verwenden, um eine Einladung an Freunde zu senden (siehe unten)
- (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);
}
}
}
}];
}
Hier ist eine schnelle 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)
}
}