Ответ 1
Вопросы, которые вы связываете, актуальны, особенно Facebook SDK 3.1 - Ошибка проверки маркера доступа, которая объясняет проблему, когда учетная запись Facebook на устройстве не синхронизирована с сервера (т.е., если вы удалили приложение из App Center). Как уже упоминалось, в 3.1.1 SDK будет вызывать обновление токена устройства только тогда, когда он получает неверный ответ от сервера. Это компромисс в удобстве для менее круглых поездок на сервер.
Предполагая, что ваш блок кода выполняется на applicationDidFinishLaunching или что-то подобное, он перейдет в блок else, потому что приложение начинается с нового сеанса. Когда он вызывает openActiveSessionWithReadPermissions, устройство iOS 6 считает, что токен действителен и позволит государству перейти в "Открыть", чтобы затем выполнить "что-то". Только тогда SDK получит неверный ответ от сервера и аннулирует токен устройства. В результате, в следующий раз, когда вызывается процедура, она предложит пользователю снова разрешить авторизацию.
Это намеренно. На данный момент вы можете рассмотреть автоматическую повторную попытку в своем приложении, если код ошибки описывает недопустимый токен. Например, см. Пример повторного кода postOpenGraph для Scrumptious. В вашем случае это может выглядеть ближе к чему-то вроде (я использовал requestForMe как "сделать что-то" для демонстрационных целей):
else {
[FBSessionopenActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
if(FB_ISSESSIONOPENWITHSTATE(status)) {
//do something
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
if (!error){
NSLog(@"success on first try");
} else if ([[error userInfo][FBErrorParsedJSONResponseKey][@"body"][@"error"][@"code"] compare:@190] == NSOrderedSame) {
//requestForMe failed due to error validating access token (code 190), so retry login
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
if (!error){
//do something again, or consider recursive call with a max retry count.
NSLog(@"success on retry");
}
}];
}
}];
}
}];
}