1

我是使用 API 的新手,所以我不确定如何正确执行它。

我正在尝试获取用户朋友的所有生日。到目前为止,我成功地获得了他们的朋友列表,然后理论上我可以简单地 ping 每个 ID 并从中获取生日。

但是我不确定如何实现这些方法。

当我的 viewController 加载时:[facebook requestWithGraphPath:@"me/friends" andDelegate:self];

这发送了请求,我实现了 FBRequestDelegate 方法来接收它:

-(void)request:(FBRequest *)request didLoad:(id)result{
    NSLog(@"result is : %@", result);
}

到目前为止工作得很好,我得到了一个包含所有朋友姓名和 ID 的对象。但是,现在我想遍历每个 ID,然后再发送几百个请求。我已经知道如何设置循环和请求调用,但是我已经在这个 viewController 中使用了 didLoad 方法,而且我显然需要在数据对象返回后以不同的方式处理数据。

与(FBRequest *)有关吗?那是什么,也许我可以使用 if(request == something) 之类的东西?谢谢

4

4 回答 4

8

您可以通过单个 fql 请求检索您(或用户)的 Facebook 朋友的生日。

您可以在此处阅读有关 fql 的信息:http: //developers.facebook.com/docs/reference/fql/

但这里有一些代码供参考(此代码在定义为 FBSessionDelegate 和 FBRequestDelegate 的类中)

- (void)request:(FBRequest *)request didLoad:(id)result {
    // result is a NSDictionary of your friends and their birthdays!
}

- (void)fbDidLogin {
    //some best practice boiler plate code for storing important stuff from fb
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

    //now load all my friend's birthdays
    NSMutableDictionary * params = 
                         [NSMutableDictionary dictionaryWithObjectsAndKeys:
                         @"select birthday, name, uid, pic_square from user where uid in (select uid2 from friend where uid1=me()) order by name", 
                         @"query",
                         nil];

    [self.facebook requestWithMethodName: @"fql.query" andParams: params andHttpMethod: @"POST" andDelegate: self];
}

- (void) loginWithFacebook {
    self.facebook = [[[Facebook alloc] initWithAppId:@"<your app id here>" andDelegate:self] autorelease];
    //IMPORTANT - you need to ask for permission for friend's birthdays
    [facebook authorize:[NSArray arrayWithObject:@"friends_birthday"]];
}
于 2012-04-26T00:27:57.923 回答
2

您应该使用此代码(我将其与 Hackbook 代码示例一起使用,并且效果很好):

在 APICallsViewController.m 添加这些函数:

/*
/* Graph API: Method to get the user's friends.
*/
- (void)apiGraphFriendsWithBirthdays {
      [self showActivityIndicator];
      HackbookAppDelegate *delegate = (HackbookAppDelegate *)[[UIApplication sharedApplication] delegate];
      NSMutableDictionary * params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
      @"picture,id,name,link,birthday,gender,last_name,first_name",@"fields",
 nil];

      [[delegate facebook] requestWithGraphPath:@"me/friends" andParams:params andHttpMethod:@"GET" andDelegate:self];

}

以上将获取大量数据,您只能使用 id、name 和生日...

/*
* Helper method to first get the user's friends and birthdays then
* do something with it.
*/
- (void)getFriendsForSetBirthday {
     // Call the friends Birthday API first
     currentAPICall = kAPIFriendsForSetBirthday;
     [self apiGraphFriendsWithBirthdays];
}

将此添加到案例部分的“- (void)request:(FBRequest *)request didLoad:(id)result”中:

    case kAPIFriendsForSetBirthday:
    {
        NSMutableArray *friends = [[NSMutableArray alloc] initWithCapacity:1];
        NSArray *resultData = [result objectForKey:@"data"];
        if ([resultData count] > 0) {
            for (NSUInteger i=0; i<[resultData count] && i < 25; i++) {
                [friends addObject:[resultData objectAtIndex:i]];

                NSDictionary *friend = [resultData objectAtIndex:i];
                long long fbid = [[friend objectForKey:@"id"]longLongValue];
                NSString *name = [friend objectForKey:@"name"];
                NSString *birthday = [friend objectForKey:@"birthday"];
                NSLog(@"id: %lld - Name: %@ - Birthday: %@", fbid, name,birthday);


            }

        } else {
            [self showMessage:@"You have no friends."];
        }
        [friends release];
        break;


    }

您需要请求生日读数的权限(我在喜欢权限部分做了,但您可以在任何地方进行,请注意,您必须先请求它才能工作):

- (void)apiPromptExtendedPermissions {
   currentAPICall = kDialogPermissionsExtended;
   HackbookAppDelegate *delegate = (HackbookAppDelegate *)[[UIApplication sharedApplication] delegate];
   NSArray *extendedPermissions = [[NSArray alloc] initWithObjects:@"user_likes",@"friends_birthday", nil];
   [[delegate facebook] authorize:extendedPermissions];
   [extendedPermissions release];
 }

在 .h 文件中不要忘记为 apicall 添加 kAPIFriendsForSetBirthday。

在 Dataset.m 添加:

NSDictionary *graphMenu7 = [[NSDictionary alloc] initWithObjectsAndKeys:
                                @"Get friends birthday", @"title",
                                @"You can get all friends birthdays.", @"description",
                                @"Get friends birthday", @"button",
                                @"getFriendsForSetBirthday", @"method",
                                nil];

并将graphMenu7添加到该文件的菜单中,不要忘记释放它。

我已经对其进行了测试,并且效果很好,希望对您有所帮助。

于 2012-05-28T19:31:27.180 回答
0

您可以将一个子类NSObject化,将其称为“BirthdayLoader”并在那里实现请求。现在,在您的控制器中,只需创建这些加载器对象的实例来检索生日。这些可以在成功检索生日时使用委托方法进行报告。

@protocol BirthDayLoaderDelegate 
-(void)didFinishLoadingRequest:(FBRequest *)request withResult:(id)result;
@end
于 2012-04-25T23:05:15.650 回答
0

考虑到要获得生日(以及一些其他属性,如用户简历),应用程序必须由 Facebook 审查。否则,尽管已正确授予权限,但 Graph API 调用将不会检索此属性。

于 2015-11-28T07:05:11.423 回答