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

Ios6 FaceBook SDK3.5 closeAndClearTokenInformation调用openActiveSessionWithReadPermissions的完成处理程序,ios6,facebook-ios-sdk,facebook-login,Ios6,Facebook Ios Sdk,Facebook Login,我在facebook登录时使用了以下代码 - (BOOL)openFBSessionWithAllowLoginUI:(BOOL)allowLoginUI withCompletionHandler:(void (^)())completionHandler { NSArray *permissions = [NSArray arrayWithObjects: @"user_photos",

我在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:permissions allowLoginUI:。这对我来说毫无意义。我认为这不是正确的行为。有人见过这个问题吗?我们如何注销?我在iOS6上使用sdk3.5。

根据Facebook开发者bug跟踪器上的说法,这种行为是“设计的”

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

因为这更准确地描述了正在发生的事情(“completionHandler”实际上是在状态更改时调用的)

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


理想情况下,由于我们将Facebook SDK用于特定目的(登录、注销、发出请求等),这些将通过代理提供,但由于SDK开发人员显然有点被“ooh blocks!!”迷住了,您必须在第一次打开会话时定义状态更改处理程序。

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

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

[FBSession.activeSession closeAndClearTokenInformation]上调用完成处理程序时,
状态的值是多少[FBSession.activeSession closeAndClearTokenInformation]
时,
state
的值是
FBSessionStateOpen
方法,然后调用
cleartokeninformation
方法?如果相同的问题仍然存在,则需要查看更多代码。也许是你的编程错误。是的,我试过了。调用“close”也会调用完成处理程序。然后发布处理facebook FBSession的整个代码。除了Adam Wallner提出的“hack”作为同一线程中的可能答案外,该问题的另一个解决方案是在完成块内检查FB session的有效状态:if(state==FBSessionStateOpen | | state==FBSessionStateOpenTokenExtended){//刚刚登录…}否则如果(错误){//登录时出错…}否则{//关闭}