15

当我打开 Facebook 会话时,一切正常,完成块被调用。

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI 
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
                                             NSLog(@"openSession handler");
                                     }];

但是后来当我要求额外的权限时,两个完成块都被调用,而不仅仅是新的。

    [FBSession.activeSession reauthorizeWithReadPermissions:
    [NSArray arrayWithObject:@"user_photos"] 
completionHandler:^(FBSession *session, NSError *error) {
                    NSLog(@"reauthorize handler");
                }];

这是一个错误还是应该是这样的?我怎样才能避免这种行为?是否可以在调用后删除完成块?

我查看了 Scrumptious 样本,其行为完全相同。当应用程序请求发布权限时,将调用发布完成块并再次调用登录块。

我正在 iOS5 和 Facebook-ios-sdk 3.1.1 上进行测试

4

2 回答 2

5

从我可以从 API 中的 Facebook 文档中收集到的信息来看,这是一种预期的行为(恕我直言,这不是好的设计,但这是另一回事)。

completionHandler 参数描述中的片段:

“...每次会话更改状态时,FBSession 对象都会调用该块”

我无法为您提供修复,但我可以提供一种解决方法:

// <Your description of why the workaround is needed.
//
// REF: http://stackoverflow.com/questions/12751635/facebook-ios-sdk-3-1-1-fbsession-completionhandler-not-removed
//
__block BOOL workaroundOneTimeRunFlag = NO;

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error)
{
    if (!workaroundOneTimeRunFlag)
    {
        workaroundOneTimeRunFlag = YES;

        // Your handler was executed for the first time
        // Run some code...
    }
}];
于 2012-12-15T17:45:06.603 回答
3

这不是错误,SDK 有意调用这两个处理程序。如文档中所述只要发生会话状态更改,就会调用 openActiveSession 的处理程序。请求额外权限会将状态更改为 FBSessionStateTokenExtended;因此,第一个处理程序被调用,然后是您在 reauthorizeWithReadPermissions 中提供的显式处理程序:

于 2012-10-09T20:17:48.400 回答