FaceBook SDK3.5 closeAndClearTokenInformation调用openActiveSessionWithReadPermissions的完成处理程序

时间:2013-05-24 22:46:51

标签: ios6 facebook-ios-sdk facebook-login

我在Facebook登录时使用了以下代码。

- (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];

这再次调用openActiveSessionWithReadPermissions的completionHandler:权限allowLoginUI:。这对我来说没有意义。我不认为这是正确的行为。有没有人见过这个问题?我们如何退出?我在iOS6上使用SDK 3.5。

2 个答案:

答案 0 :(得分:2)

根据Facebook Developer bug追踪器上的this thread,这种行为是"设计"。

事实上,我确实建议这个方法更好的名称是:openActiveSessionWithReadPermissions:allowLoginUI:stateChangeHandler:

因为它更准确地描述了正在发生的事情(" completionHandler"实际上是在状态变化时被调用)。

您可以通过以下几种方式处理此问题:Ben Cohen建议您可以在完成块中将completionHandler设置为nil(以确保一次性运行),this answer建议创建一个FBSessionStateHandler运行一次处理程序,或者您可以打开状态更改。

理想情况下,由于我们依赖Facebook SDK用于特定目的(登录,注销,发出请求等),这些将通过代表提供,但由于SDK开发人员显然有点被带走&# 34; ooh blocks !!",您必须在首次打开会话时定义状态更改处理程序。

答案 1 :(得分:0)

我认为这是一种非常糟糕的行为。

FBSession有一个隐藏的属性:

@property (readwrite, copy) FBSessionStateHandler loginHandler;

所以你可以通过这个代码将它设置为nil,如下所示:

[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...
                                      }];