Как перейти на следующую страницу в ответе Facebook JSON с помощью iOS SDK?

В Facebook iOS SDK я могу запросить такие запросы:

[_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 интерфейс для этого?

РЕДАКТИРОВАТЬ: Если возможно, я действительно хочу получить ответ с помощью Graph API, поскольку Facebook в настоящее время не поддерживает REST API.

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


person Enrico Susatyo    schedule 27.01.2011    source источник
comment
Кстати, ваш формат времени - это просто кодировка URL. Расшифруйте его, и вы получите 2010-09-13T00:25:16+0000. Теперь более очевидно? :)   -  person DougW    schedule 01.09.2012
comment
Да! Я не знал, как я пропустил это. Прошло полтора года с тех пор, как я это опубликовал.   -  person Enrico Susatyo    schedule 02.09.2012


Ответы (5)


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

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

ps второй параметр "httpMethod" всегда может быть @"GET", вы можете его опустить

person UIBuilder    schedule 07.02.2011
comment
ВАУ, работает очень хорошо! Большое тебе спасибо! Кстати, почему это не встроено в Facebook SDK? Вы не знаете, это запланированное обновление? - person Enrico Susatyo; 08.02.2011
comment
Нет, я не нашел задач по этой функции на github.com/facebook/facebook. -ios-sdk/issues но ты можешь быть первым кто это сделал ) - person UIBuilder; 08.02.2011
comment
Этот ответ больше не относится к последней версии Facebook SDK. Я добавил новый ответ, объясняющий, как это сделать в последней версии. - person DougW; 01.09.2012

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

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

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

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];

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

person DougW    schedule 31.08.2012
comment
Спасибо, я еще не изучал iOS SDK 3.0, но похоже, что они не делают это проще. - person Enrico Susatyo; 02.09.2012

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

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

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

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

person donkim    schedule 04.02.2011
comment
Хм, у меня не работает, у меня ошибка из facebook: не удалось разобрать 2011-01-27T04%3A48%3A50%2B0000 на дату или время. Любые другие идеи? - person Enrico Susatyo; 07.02.2011
comment
Хм, странно... Раньше у меня это работало. Я тоже попытаюсь понять это, так как мне это нужно для моего проекта.. Буду держать вас в курсе.. - person donkim; 07.02.2011
comment
Найдите с и до на этой странице: developers.facebook.com/docs/api. В нем говорится, что вы можете использовать практически любой допустимый формат даты. Я пробовал использовать с = вчера и до = вчера, и они оба работают. Я также пытался использовать метку времени (преобразованную здесь: epochconverter.com), и это также дало мне правильный формат времени. . Итак... похоже, вы можете преобразовать его в временную метку Unix. Хотя я думаю, что это странно, что они предложили дату в формате, указанном выше, и не приняли ее... Требуется дополнительное расследование.. - person donkim; 07.02.2011
comment
Я на самом деле не совсем понимаю формат времени. Тот, который я тестирую, это 2010-09-13T00%3A25%3A16%2B0000, когда я попробовал epochconverter.com, он сказал, что это 1 января 1970 года. Что-то здесь определенно не так... Я немного поищу немного больше, а также. - person Enrico Susatyo; 07.02.2011
comment
@donkim Кажется, Гай сделал это. Хотя я не скажу, что это особенно элегантное решение (взлом SDK), я посмотрю, есть ли у Facebook этот метод в разработке. - person Enrico Susatyo; 08.02.2011
comment
Это отличное решение. На самом деле я просто заставил его работать с приведенным выше решением (вы должны использовать параметр until, извлечь дату, а затем поместить ее в словарь, используя [NSString stringWithFormat:@"%@" extractedDate]. Но вы знаете, мне нравится это решение, и я согласен, что это должно быть включено в SDK. - person donkim; 08.02.2011

Да, вы можете получить результат, вызвав функцию в 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];

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

person Inam Abbas    schedule 03.02.2011
comment
Это позволит получить первые 150 статусов, верно? Как получить следующие 150? - person Enrico Susatyo; 04.02.2011
comment
Вы можете установить бесконечный предел, например, 100000 или более, но максимальное количество записей, предоставляемых facebook, составляет около 1 года статусов. Вы можете получить больше, используя любой API Facebook, поскольку они не предоставляют данные более года назад. - person Inam Abbas; 04.02.2011
comment
что вы имеете в виду, что я могу получить больше, чем это, используя любой API Facebook? - person Enrico Susatyo; 07.02.2011
comment
Извините На самом деле я хочу написать Вы не можете получить больше .. - person Inam Abbas; 09.02.2011

По крайней мере, что касается формата даты, это вариант формата 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.

person giff    schedule 23.11.2011