10

我在 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:permissions allowLoginUI:的completionHandler。这对我来说没有意义。我不认为这是正确的行为。有没有人看到这个问题?我们如何注销?我在 iOS6 上使用 SDK 3.5。

4

2 回答 2

2

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

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

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

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

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

于 2013-12-09T14:42:47.783 回答
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...
                                      }];
于 2014-03-27T15:41:03.773 回答