1

API を使用するのは初めてなので、これを適切に実行する方法がわかりません。

ユーザーの友達の誕生日をすべて取得しようとしています。これまでのところ、friendList の取得に成功しています。理論上は、各 ID に ping を実行するだけで、そこから誕生日を取得できます。

ただし、メソッドを実装する方法がわかりません。

私の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、名前、誕生日のみを使用できます...

/*
* 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 に答える