2011-01-27 3 views
8

В Facebook IOS SDK, я могу попросить запросов, как это:Как перейти на следующую страницу в ответ на JSON в Facebook с помощью SDK для iOS?

[_facebook requestWithGraphPath:@"me/feed" andDelegate:self]; 

Но часто Facebook даст ограниченный ответ JSON с URL, которые будут использоваться для запроса, чтобы перейти на более ранние сроки, например. Таким образом, в ответ JSON, я буду иметь:

data =  (/*things here... status updates, photos, etc...*/ 
    ); 
paging =  { 
     next = "https://graph.facebook.com/me/feed?sdk=ios&sdk_version=2&access_token= <something>&until=2010-12-04"; 
     previous = "https://graph.facebook.com/me/feed?sdk=ios&sdk_version=2&access_token=<something>&since=<something>"; 
    }; 

Что мне интересно ... Как перейти к предыдущему URL? Обеспечивает ли SDK интерфейс для этого?

EDIT: Если возможно, я действительно хочу получить ответ с помощью Graph API, поскольку Facebook в настоящее время отвергает API REST.

БОНУС: Если кто-нибудь может объяснить формат времени, который возвращается Facebook. Например, у меня есть 2010-09-13T00%3A25%3A16%2B0000.

+3

Кстати, ваш формат времени всего лишь URL-код. Декодируйте его, и вы получите это «2010-09-13T00: 25: 16 + 0000». Теперь более очевидно? :) – DougW

+0

Да! Я не знал, как я это пропустил. Прошло полтора года с тех пор, как я опубликовал это. –

ответ

7

все, что вам нужно, чтобы добавить метод к подклассу Facebook или самому

- (void)requestWithURLString:(NSString *)fullURL 
       andHttpMethod:(NSString *)httpMethod 
       andDelegate:(id <FBRequestDelegate>)delegate { 
    [self openUrl:fullURL params:nil httpMethod:httpMethod delegate:delegate]; 
} 

пса вторых пары «HTTPMethod» могут быть всегда @ «GET» вы можете опустить его

+0

WOW, работает очень хорошо! Большое спасибо! BTW почему это не делает SDK для Facebook? Знаете ли вы, запланировано ли это обновление? ? –

+0

Нет, я не нашел никаких задач по этой функции на https://github.com/facebook/facebook-ios-sdk/issues , но вы можете быть первым, кто это сделал) – UIBuilder

+0

О, хорошо, спасибо файл, который =) –

1

Да, вы можете получить результат, вызвав функцию API я использовал ниже код, чтобы получить статусы пользователей в вашем случае вы можете использовать stream.get метод, вы можете его нашли здесь http://developers.facebook.com/docs/reference/rest/stream.get/

NSMutableDictionary * params = [[NSMutableDictionary alloc] init]; 
    [params setValue:[NSString stringWithFormat:@"%@", appDelegate.user_id] forKey:@"uid"]; 
    [params setValue:@"150" forKey:@"limit"]; 
    [params setValue:@"results" forKey:@"callback"]; 


    [_facebook requestWithMethodName: @"status.get" 
      andParams: params 
      andHttpMethod: @"POST" 
         andDelegate: self]; 

Вы можете использовать этот код для своей цели.

+0

Это позволит получить первые 150 статусов правильно? Как получить следующие 150? –

+0

Вы можете установить ограничение на бесконечность, равное 100000 или более, но максимальное количество записей в facebook составляет около 1 года. Вы можете получить больше, чем при использовании любого из facebook api, поскольку они не предоставляют данные больше, чем год назад. –

+0

Что вы имеете в виду, я могу получить больше, чем с помощью любой facebook api? –

2

Вы можете сделать что-то вроде этого:

[appDelegate.fb requestWithGraphPath:@"me/home" 
          andParams:[NSMutableDictionary dictionaryWithObject:@"2011-01-27T04%3A48%3A50%2B0000" forKey:@"since"] 
         andDelegate:self]; 

Обратите внимание, что в paging части вашего корма, то next и previous URL-адреса отличаются только одним параметром запроса (until и since). Вы можете использовать значения, которые вы получаете от этого, чтобы получить следующую и предыдущую страницу результатов.

Надеюсь, это поможет!

+0

Ах ... Это выглядит выполнимым, спасибо! Я попробую это скоро. –

+0

Хмм не работает для меня, у меня есть ошибка от facebook: не удалось разобрать 2011-01-27T04% 3A48% 3A50% 2B0000 в дату или время. Любые другие идеи? –

+0

Хм, это странно ... Это сработало для меня раньше. Я также попытаюсь это понять, так как мне это нужно для моего проекта .. Будет держать вас в курсе. – donkim

0

По крайней мере, поскольку формат даты идет, его вариант формата RFC 3339. Насколько я знаю, iOS не имеет заранее определенного форматирования этого типа.

Я создаю форматирование даты и сохраняю его (они странно медленны для создания), поэтому я могу легко их преобразовать при работе с данными FB.

 NSDateFormatter * sRFC3339DateFormatter = nil; 
     NSLocale * enUSPOSIXLocale; 

     sRFC3339DateFormatter = [[NSDateFormatter alloc] init]; 
     enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 

     [sRFC3339DateFormatter setLocale:enUSPOSIXLocale]; 
     [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"]; 
     [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

Как только у вас есть такой форматирующий инструмент, вы можете легко конвертировать туда и обратно.

NSDate* myDate = nil; 
myDate = [sRFC3339DateFormatter dateFromString:@"2011-01-27T04%3A48%3A50%2B0000"]; 

Прерывание URL-адреса в словаре строк довольно просто с использованием методов NSURL.

6

С Facebook iOS SDK версии 3, исходный ответ больше не относится к текущей версии.

Мне пришлось делать рытье, потому что новая версия не облегчает это.Я нашел пример того, как это сделать в классе FBGraphObjectPagingLoader, который предлагает новый SDK, чтобы помочь сделать это для таблиц. Это невероятно уродливо, но я предполагаю, что это «рекомендуемый» метод, так как он использует их.

Вот мое небольшое изменение их кода (найденный первоначально в FBGraphObjectPagingLoader's followNextLink method)

FBRequest *request = [[[FBRequest alloc] initWithSession:FBSession.activeSession graphPath:nil] autorelease]; 
FBRequestConnection *connection = [[[FBRequestConnection alloc] init] autorelease]; 
[connection addRequest:request completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
    // Do some stuff 
}]; 

// Override the URL using the one passed back in 'next'. 
NSURL *url = [NSURL URLWithString:urlString]; 
NSMutableURLRequest* urlRequest = [NSMutableURLRequest requestWithURL:url]; 
connection.urlRequest = urlRequest; 

[connection start]; 

Вы, конечно, можете изменить свою библиотеку и инкапсулировать это в самом классе, если вы хотели.

+0

Спасибо, я еще не заглянул в iOS SDK 3.0, но похоже, что они не упрощают это. –

Смежные вопросы