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

Shi*_*mar 10 facebook-login facebook-ios-sdk ios6

我在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;
           }
       }
   }];
}
Run Code Online (Sandbox Code Playgroud)

以上工作正常登录.但是,当我使用以下代码注销时

[FBSession.activeSession closeAndClearTokenInformation];
Run Code Online (Sandbox Code Playgroud)

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

cle*_*bit 2

根据Facebook Developer bug tracker 上的这个帖子,这种行为是“设计使然”。

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

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

您可以通过多种方式处理此问题:Ben Cohen建议您可以在完成块中设置 to completionHandler(以确保运行一次),此答案建议创建一个运行一次处理程序,或者您可以打开状态更改。nilFBSessionStateHandler

理想情况下,由于我们依赖 Facebook SDK 来实现特定目的(登录、注销、发出请求等),这些将通过委托提供,但由于 SDK 开发人员显然对“哦块!”有点得意忘形了! ”,您必须在首次打开会话时定义状态更改处理程序。