Facebook iOS SDK 3.6中的startWithGraphPath完成块未被执行

3

我已经与Facebook进行了集成,以便我可以在其他事项之外,发布状态到我的动态。我基于发布到动态开发者教程中的一些代码。当从我的iOS应用程序运行以下Graph API请求时,请求的完成块从未被调用,并且在XCode调试日志中没有出现任何错误。

[FBRequestConnection
startWithGraphPath:@"me/feed"
parameters:params
HTTPMethod:@"POST"
completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    if (error) {
        DLog(@"error: domain = %@, code = %d", error.domain, error.code);
    } else {
        DLog(@"Posted action, id: %@", result[@"id"]);
    }
}];

我有两个方便的函数,在执行此请求之前对当前的activeSession进行检查。它们看起来像这样:

+ (BOOL)facebookSessionIsOpen {
    return (FBSession.activeSession.isOpen);
}

+ (BOOL)facebookSessionHasPublishPermissions {
    if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound ||
        [FBSession.activeSession.permissions indexOfObject:@"publish_stream"] == NSNotFound ||
        [FBSession.activeSession.permissions indexOfObject:@"manage_friendlists"] == NSNotFound) {
        return NO;
    } else {
        return YES;
    }
}

这两个函数都会返回YES,表示具有必要的发布权限的活动会话。更令人困惑的是,在成功执行相同的检查后(不需要授予发布权限即可拉取用户资料),我可以毫无问题地拉取用户资料,使用以下代码:

[FBRequestConnection
startWithGraphPath:@"me"
parameters:[NSDictionary dictionaryWithObject:@"picture,id,birthday,email,location,hometown" forKey:@"fields"]
HTTPMethod:@"GET"
completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    NSDictionary* resultDict = (NSDictionary*)result;

    NSString* emailAddress = resultDict[@"email"];
    NSString* location = resultDict[@"location"][@"name"];
    NSString* birthday = resultDict[@"birthday"];
    NSString* homeTown = resultDict[@"hometown"][@"name"];
    ...
}];

有什么建议可以解决这个问题的调试?
1个回答

5
原来问题出在线程上。Facebook iOS SDK似乎不喜欢从与调用openActiveSessionWithReadPermissions的线程不同的线程上执行FBRequest并很快就会死锁。结果发现我在单独的线程中运行postStatus请求,代码如下:
dispatch_queue_t some_queue = dispatch_queue_create("some.queue.name", NULL);
dispatch_async(some_queue, ^{
    [FacebookHelper postStatusToFacebookUserWall:newStatus withImage:imageData];
}];

请确保您的openActiveSessionWithReadPermissions和任何FBRequest排列都在同一线程上进行,否则您很可能会遇到这些静默失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接