Запрос данных пользователя Facebook через новую социальную среду iOS6

Я пытаюсь запросить информацию о пользователе с помощью нового API интеграции iOS 6 в Facebook. Это код, который я использую, который в основном идентичен тому, что они продемонстрировали на WWDC:

{
NSDictionary *parameters = @{};
NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];
SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook
                                        requestMethod:SLRequestMethodGET
                                                  URL:url
                                           parameters:parameters];
request.account = self.account;
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    NSLog(@"Facebook request received, status code %d", urlResponse.statusCode);
    NSString *response = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"Response data: %@", response);
    dispatch_async(dispatch_get_main_queue(), ^{

    });
}];
}

Проблема в том, что я получаю код ошибки 2500 от Facebook: & quot; Активный токен доступа должен использоваться для запроса информации о текущем пользователе. & Quot; Если я изменю запрос на https://graph.facebook.com/[facebook id], он будет работать нормально. Я предполагаю, что проблема заключается в том, что iOS передает маркер доступа к приложению вместо токена доступа пользователя при отправке запроса через requestForServiceType. Я просто не знаю, как это исправить. Очевидно, предвидеть и жестко кодировать идентификаторы Facebook моих пользователей не вариант. Какие-либо предложения?

 Prerna chavan13 сент. 2012 г., 06:09
Вы получили ответ? Как iOS 6 выпущен.

Ответы на вопрос(6)

я исправил его, сохранив свою учетную запись после обновления учетных данных.

Убедитесь, что ваш(ACAccount *)facebookAccount (or in your case self.account) объект сильный, и вы устанавливаете его правильно при получении разрешений.

добавьте свой активный токен в параметре как

NSDictionary *parameters = [NSDictionary dictionaryWithObject:@"PUT_ACCESS_TOKEN_HERE" forKey:@"access_token"];
 30 апр. 2013 г., 19:00
Как вы получаете этот ключ доступа в коде? Или вы предлагаете ввести туда действительный код доступа? Кажется, что коды доступа истекают, так что это не будет хорошим вариантом.

Хорошо, вот как я делаю эту интеграцию с iOS 6 и получаю то, что хочу от Facebook:

В AppDelegate я делаю это:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    return [FBSession.activeSession handleOpenURL:url];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [FBSession.activeSession handleDidBecomeActive];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    [FBSession.activeSession close];
}

и в моем ViewController, где я хочу получить информацию о себе или своих друзьях, я делаю это (ПРИМЕЧАНИЕ: это тест, поэтому у него много разрешений!):

NSArray *permissions =
    [NSArray arrayWithObjects:@"email", @"user_location",
     @"user_birthday",
     @"user_likes", @"user_interests",@"friends_interests",@"friends_birthday",@"friends_location",@"friends_hometown",@"friends_photos",@"friends_status",
     @"friends_about_me", @"friends_birthday", @"friends_hometown", @"friends_interests", @"friends_likes", @"friends_location", nil];

    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                                      /* handle success + failure in block */
                                      if (status) {
                                          NSLog(@"Facebook Read Permission is successful!");
                                          [self presentPostOptions];

                                          //   [self presentPostOptions];


                                      }
                                  }];

Затем в & quot; presentPostOptions & quot; Я делаю это (в этом примере я пытаюсь получить что-то от моего друга):

- (void)presentPostOptions
{

    [[FBRequest requestForMyFriends] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error)

     {

         if (!error) {

NSArray *data = [user objectForKey:@"data"];
             NSLog(@"%d", [data count]);
             for (FBGraphObject<FBGraphUser> *friend in data) {
                 NSLog(@"%@", [friend first_name]);
                 NSLog(@"%@", [friend last_name]);
                 NSLog(@"%@", [friend id]);
                 //make sure you have FBProfilePictureView outlet in your view
                 //otherwise skip the profile picture!
                 self.fbProfilePic.profileID = @"you'r friend's profile.id";

             }
         }
         else
         {
             NSLog(@"error");
             //  [self didFailWithError:error];
         }
     }];

Я не знаю, что еще вы хотите сделать, потому что в своем вопросе вы только что попытались установить соединение, но таким образом вы можете делать все, что захотите, пока вы интегрированы в iOS 6.

Еще одна вещь, убедитесь в настройках приложения через Facebook и в настройках, например, включите ваше приложение для iOS и идентификатор для iPhone / iPad. Также FacebookAppID в вашем списке.

Дайте мне знать, если это сработает для вас,

РЕДАКТИРОВАТЬ: кстати мой Facebook SDK 3.1.1.

Ответ прост

во viewDidLoad () используйте:

accountStore= [[ACAccountStore alloc]init];
facebookAccountType= [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

NSDictionary *options= @{
ACFacebookAudienceKey: ACFacebookAudienceEveryone,
ACFacebookAppIdKey: @"<YOUR FACEBOOK APP ID>",
ACFacebookPermissionsKey: @[@"public_profile"]

                          };    

[accountStore requestAccessToAccountsWithType:facebookAccountType options:options completion:^(BOOL granted, NSError *error) {

    if (granted) {
        NSLog(@"Permission has been granted to the app");
        NSArray *accounts= [accountStore accountsWithAccountType:facebookAccountType];
        facebookAccount= [accounts firstObject];
        [self performSelectorOnMainThread:@selector(facebookProfile) withObject:nil waitUntilDone:NO];

    } else {
        NSLog(@"Permission denied to the app");
    }
}];

И функция- (недействительная) facebookProfile

NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/me"];

Notice the params you need are added as dictionary Refer, below for complete list https://developers.facebook.com/docs/graph-api/reference/user

NSDictionary *param=[NSDictionary dictionaryWithObjectsAndKeys:@"picture,id,name",@"fields", nil];

SLRequest *profileInfoRequest= [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:param];
profileInfoRequest.account= facebookAccount;


[profileInfoRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    NSLog(@"Facebook status code is : %ld", (long)[urlResponse statusCode]);

    if ([urlResponse statusCode]==200) {

        NSDictionary *dictionaryData= [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error];



    } else {

    }
}];


}

Я столкнулся с той же проблемой и нашел обходной путь:

NSString *uid = [NSString stringWithFormat:@"%@", [[self.account valueForKey:@"properties"] valueForKey:@"uid"]] ;                
NSURL *url = [NSURL URLWithString:[@"https://graph.facebook.com" stringByAppendingPathComponent:uid]];
 24 окт. 2012 г., 21:01
Проблема была в неправильных настройках приложения на FB. Я изменил настройки в соответствии с этим постомstackoverflow.com/questions/12644229/… и это решило проблему.

Ваш ответ на вопрос