Facebook ios sdk 3.1.1 FBSession completeHandler не удаляется

Когда я открываю сеанс Facebook, все идет хорошо, и блок завершения получает вызов.

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI 
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
                                             NSLog(@"openSession handler");
                                     }];

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

    [FBSession.activeSession reauthorizeWithReadPermissions:
    [NSArray arrayWithObject:@"user_photos"] 
completionHandler:^(FBSession *session, NSError *error) {
                    NSLog(@"reauthorize handler");
                }];

Является ли это ошибкой или она должна быть такой? Как я могу избежать такого поведения? Можно ли удалить блок завершения после вызова?

Я заглянул в образец Scrumptious, и поведение точно такое же. Когда приложение запрашивает разрешения на публикацию, вызывается блок публикации-завершения, и блок входа снова вызывается.

Я тестирую на iOS5 и Facebook-ios-sdk 3.1.1

Ответы

Ответ 1

Из того, что я мог собрать из документации по Facebook в API, это предполагаемое поведение (неплохой дизайн IMHO, но эта другая история).

Фрагмент описания описания параметра завершения: </p>

"... объект FBSession будет вызывать блок каждый раз, когда сеанс изменяет состояние"

Я не могу предложить вам исправление, но могу предложить обходное решение:

// <Your description of why the workaround is needed.
//
// REF: http://stackoverflow.com/questions/12751635/facebook-ios-sdk-3-1-1-fbsession-completionhandler-not-removed
//
__block BOOL workaroundOneTimeRunFlag = NO;

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error)
{
    if (!workaroundOneTimeRunFlag)
    {
        workaroundOneTimeRunFlag = YES;

        // Your handler was executed for the first time
        // Run some code...
    }
}];

Ответ 2

Это не ошибка, и оба обработчика намеренно вызывают SDK. Как отмечено в docs, обработчик openActiveSession вызывается всякий раз, когда происходит изменение состояния сеанса. Запрос дополнительных разрешений изменит состояние на FBSessionStateTokenExtended; поэтому первый обработчик вызывается, а затем явный обработчик, который вы предоставляете в reauthorizeWithReadPermissions: