iOS 6 Facebook Логин не обновляет токен доступа
Ничто из того, что я читаю (много статей для разработчиков FB и ТАК вопрос), не помогает, поэтому я решил опубликовать здесь. Я пытаюсь заставить все это работать с iOS 6 и Facebook SDK 3.1.1.
У меня довольно простые настройки: мое приложение для iOS проходит проверку подлинности через Facebook, я передаю access_token на свой сервер, и теперь пользователь входит в мое приложение. Единственное, что они могут сделать, связанные с Facebook, это опубликовать что-то на своей стене. Я использую устаревшее диалоговое окно, чтобы пользователь мог добавлять свои собственные комментарии.
Все отлично работает на новой установке в течение первого часа или около того. Если пользователь вошел в систему через приложение «Настройки iOS», ему будет предложено быстрое окно подтверждения iOS, я получу его токен, отправлю его на свой сервер, и у нас все хорошо.
Если я вставлю полученный токен в отладчик доступа Facebook, он показывает, что срок его действия истечет через час.
Если я подожду этот час и вернусь к приложению после этого, все, что я пытаюсь сделать, дает мне эту ошибку:
{"error_code":190,"
error_msg":"Error validating access token:
Session has expired at unix time 1351497600.
The current unix time is 1351525180. }
Что мне нужно сделать, чтобы все работало?я прочел что в SDK 3.1.1 FBSession позаботится об этом, но это не так. Срок действия моего маркера доступа истекает, и как только он появится, iOS / FB SDK не вернет мне обновленный токен.Даже выход из системы (который вызывает[FBSession.activeSession closeAndClearTokenInformation]
) не исправить это. Единственное, что мне удалось сделать, - это «Сбросить содержимое и настройки» в настройках симулятора iOS, повторно ввести свои учетные данные FB в Settings.app и пересобрать мое приложение. Только тогда я могу получить еще один токен, срок действия которого истекает через час.Случайные заметки:
Когда мое приложение возобновляет работу, я звоню[FBSession.activeSession handleDidBecomeActive]
а также[self.facebook extendAccessTokenIfNeeded]
Согласно вопросу SO, связанному с вышеупомянутым, SDK должен автоматически вызыватьFBSession#renewSystemAuthorization
, Я поместил туда NSLog, и я никогда не видел, чтобы этот метод вызывался.ОБНОВЛЕНИЕ № 1:
Я упоминал, что прочитал, что SDK будет обрабатывать недействительные / просроченные токены. Кажется, что это должно происходить в FBRequestConnection # completeWithResults: orError :. Смотрите встроенные комментарии для заметок о пути к коду.
- (void)completeWithResults:(NSArray *)results
orError:(NSError *)error
{
int count = [self.requests count];
for (int i = 0; i < count; i++) {
FBRequestMetadata *metadata = [self.requests objectAtIndex:i];
id result = error ? nil : [results objectAtIndex:i];
NSError *itemError = error ? error : [self errorFromResult:result];
id body = nil;
if (!itemError && [result isKindOfClass:[NSDictionary class]]) {
NSDictionary *resultDictionary = (NSDictionary *)result;
body = [FBGraphObject graphObjectWrappingDictionary:[resultDictionary objectForKey:@"body"]];
}
...
// *******************************************
// My code actually falls into this block, proving that I do in fact have an invalid session
// *******************************************
if ([self isInvalidSessionError:itemError
resultIndex:error == itemError ? i : 0]) {
[metadata.request.session closeAndClearTokenInformation:itemError];
// *******************************************
// Unfortunately metadata.request.session is nil, so this condition is never
// run, so renewySystemAuthorization is never called
// *******************************************
if (metadata.request.session.loginType == FBSessionLoginTypeSystemAccount){
[FBSession renewSystemAuthorization];
}
}
...
}