Я думаю, что решение enbr размещено не является полным.Я объясню, почему:
Ошибки токена доступа возвращаются, когда заканчивается сеанс Facebook, и вы продолжаете использовать старый токен доступа.Выход из системы - не единственный сценарий, в котором заканчивается сеанс (например, смена пароля для входа в Интернет).Следовательно, недостаточно просто очистить пользовательские настройки по умолчанию после выхода из системы.
Со стороны клиента мы не знаем, действителен ли у нас токен доступа, до тех пор, пока не придет ответ с такой информацией.Поэтому вам необходимо обнаружить ошибки токена доступа и восстановить работоспособность экземпляра Facebook, очистив старый токен доступа и дату истечения срока действия.Таким образом, пользователю потребуется снова войти в систему, чтобы получить новый токен доступа.
Итак, IMO, вам нужно сделать следующее:
Обрабатывать ошибки и обнаруживатьпри возникновении ошибки токена доступа.
При возникновении ошибки токена доступа автоматически выйдите из системы и очистите значения по умолчанию для удаления старого токена доступа (шаг 3).
В результате выхода из системы вам необходимо очистить пользовательские настройки по умолчанию для токена доступа и даты истечения срока действия (как отправлено enbr).
Здесь у вас есть код, который можно использоватьдля обнаружения ошибок токена доступа:
-(BOOL)isAccessTokenError:(NSError *) error {
if ([[error domain] isEqualToString:@"facebookErrDomain"] && [error code] == 10000 ) {
NSDictionary *userInfo = [error userInfo];
NSDictionary *errorAsDictionary = [userInfo objectForKey:@"error"];
if ([[errorAsDictionary objectForKey:@"type"] isEqualToString:@"OAuthException"]) {
//Invalid access token
return YES;
}
}
if ([[error domain] isEqualToString:@"facebookErrDomain"] && ([error code] == 110 || [error code] == 190)) {
//Error accessing access token
return YES;
}
return NO;
}
Места для обработки таких ошибок:
- (void)request:(FBRequest*)request didFailWithError:(NSError*)error;
- (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error;
Надеюсь, это поможет.
ОБНОВЛЕНИЕ: Я забыл упомянуть.Если вы используете функцию единого входа (скорее всего), я думаю, что это очень хорошая идея - очистить куки-файлы перед входом в систему.Иногда после ошибки неверного токена доступа кажется, что вход в систему не вернет объект Facebook в рабочее состояние (действительный токен доступа), если не будет выполнен «чистый вход в систему».Хотя это не всегда работает.
Кроме того, если вы не используете функцию единого входа, это использовалось для исправления всплывающего сообщения о призрачном входе в систему, которое автоматически исчезало снова.
Так я очищаю файлы cookie.:
NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray* facebookCookies = [cookies cookiesForURL:
[NSURL URLWithString:@"http://login.facebook.com"]];
for (NSHTTPCookie* cookie in facebookCookies) {
[cookies deleteCookie:cookie];
}
enter code here