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: