facebook ios sdk 3.1.1 FBSession completionHandler未删除

use*_*724 15 facebook ios

当我打开Facebook会话时,一切都很顺利,完成块被调用.

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

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

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

这是一个错误还是它应该是这样的?我该如何避免这种行为?是否可以在通话后删除完成块?

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

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

die*_*dez 5

从我从API的API文档中收集到的,这是一个预期的行为(不是好的设计恕我直言,但这是另一个故事).

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


小智 3

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