Подтвердить что ты не робот

Обрабатывать недействительный accessToken с FBSession openActiveSessionWithReadPermissions в Facebook iOS 3.1.1 SDK

Прежде всего, я прочитал как этот, так и этот вопрос, чтобы решить проблему ниже и перед тем, как спросить.

Моя проблема в том, что при истечении срока доступа accessToken (либо из-за истечения срока действия, либо вручную, удалив приложение из моего Facebook App Center), следующий код:

if ([[FBSession activeSession] isOpen]) {
        //do something
    }
else {
        [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
            if(FB_ISSESSIONOPENWITHSTATE(status)) {
                //do something
            }
          }
       }];
     }

попадает в блок else с открытием FBSession.activeSession, но когда выполняется "делать что-то", accessToken недействителен, поэтому запрос получает ошибку: код состояния HTTP: 400. Когда я пытаюсь выполнить всю процедуру дважды сразу, FBSession запрашивает разрешение (либо UIAlertView для iOS6, интегрированного facebook, Facebook App, либо Facebook на сайте Safari), а все остальное выполняется гладко.

Я забочусь о том, почему мне приходится делать все дважды, чтобы хорошо работать, и почему Facebook SDK не может обнаружить в первый раз, что activeSession и accessToken недействительны.

Спасибо всем заблаговременно!

4b9b3361

Ответ 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");
                        }
                    }];
                }
            }];
        }
    }];
}