2013-05-24 2 views
10

У меня есть следующий код, который я использую во время входа в facebook.FaceBook SDK3.5 closeAndClearTokenInformation вызывает обработчик завершения openActiveSessionWithReadPermissions

- (BOOL)openFBSessionWithAllowLoginUI:(BOOL)allowLoginUI 
      withCompletionHandler:(void (^)())completionHandler 
{ 

    NSArray *permissions = [NSArray arrayWithObjects: 
         @"user_photos", 
         @"email", 
         nil]; 
    return [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
     if (error != nil) { 
     ... 
     } else { 
      switch (state) { 
       case FBSessionStateOpen: 
       { 
        ... 
       } 
       case FBSessionStateClosed: 
       { 
        ... 
       } 
       case FBSessionStateClosedLoginFailed: 
       { 
        ... 
       } 
       default: 
        break; 
      } 
     } 
    }]; 
} 

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

[FBSession.activeSession closeAndClearTokenInformation]; 

это снова вызывает completionHandler из openActiveSessionWithReadPermissions: разрешений allowLoginUI :. Это не имеет смысла для меня. Я не думаю, что это правильное поведение. Кто-нибудь видел эту проблему? Как мы выходим из системы? Я использую SDK 3.5 на iOS6.

+0

Что такое 'state' значение, когда обработчик завершения является вызывается '[FBSession.activeSession closeAndClearTokenInformation];' – Geek

+0

Значение 'state' -' FBSessionStateOpen', когда я вызываю '[FBSession.activeSession closeAndClearTokenInformation]' –

+0

Пробовал ли вы сначала вызвать метод 'close'' FBSession', а затем метод clearToken? Если эта же проблема сохраняется, тогда вам нужно посмотреть больше кода. Возможно, ваша ошибка программирования. – Geek

ответ

2

Согласно this thread в блоге разработчиков Google, это поведение является «по дизайну».

В самом деле, я предлагаю лучшее название для этого метода будет: openActiveSessionWithReadPermissions:allowLoginUI:stateChangeHandler:

как более точно описывает то, что происходит (далее «completionHandler», на самом деле называется на изменение состояния).

Вы можете справиться с этим несколькими способами: Ben Cohen предложить вы можете либо установить completionHandler в nil в блоке завершения (для обеспечения обкатки один раз), this answer предлагает создать FBSessionStateHandler вводные один раз обработчика, или вы можете переключиться на изменение состояния.

В идеале, поскольку мы полагаемся на SDK для определенных целей (войдите в систему, выйдите из системы, сделайте запросы и т. Д.), Они будут предоставлены через делегатов, но поскольку разработчики SDK, по-видимому, немного увлеклись " ooh blocks !! ", вам остается определить свой обработчик изменения состояния в точке, где вы сначала открываете сеанс.

+0

За исключением «взлома», предложенного Адамом Уолнером, как можно ответить в этой же теме, еще одним решением проблемы является проверка внутри блока завершения эффективного состояния сеанса FB: если (состояние == FBSessionStateOpen || состояние == FBSessionStateOpenTokenExtended) {// только вошел в ... } еще если (ошибка) { // ошибка при входе в систему ... } еще {// закрыт } – viggio24

0

Это очень плохое поведение, я думаю.

FBSession имеет скрытое свойство:

@property (readwrite, copy) FBSessionStateHandler loginHandler; 

Таким образом, вы можете установить его в ноль с помощью этого кода в блоке, как это:

[FBSession openActiveSessionWithReadPermissions:FACEBOOK_PERMISSIONS 
              allowLoginUI:NO 
             completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
              [[FBSession activeSession] performSelector:NSSelectorFromString(@"setLoginHandler:") withObject:nil]; 
#pragma clang diagnostic pop 
              // Your stuff... 
             }];