FBSession requestNewPublishPermissions在响应之前失败

Tid*_*dly 6 facebook facebook-graph-api ios facebook-ios-sdk

我正在尝试使用iOS上的Facebook SDK获得用户的发布权限.

我正在调用下面的代码,如果应用程序没有必要的发布权限发布到用户的Facebook墙,则调用该方法.

    // No permissions found in session, ask for it
    [FBSession.activeSession requestNewPublishPermissions: [NSArray arrayWithObject:@"publish_actions"]
                                          defaultAudience: FBSessionDefaultAudienceEveryone
                                        completionHandler: ^(FBSession *session, NSError *error)
     {
         if( !error )
         {
          // Do something
         }
     }];
Run Code Online (Sandbox Code Playgroud)

我第一次调用此代码时,它将用户带到权限页面,在它甚至切换到设备上的safari之前,块被调用并返回此错误消息

Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xc426410 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorReauthorizeFailedReasonUserCancelled,
Run Code Online (Sandbox Code Playgroud)

该应用程序然后继续在safari中显示权限页面,用户选择ok.然后它返回到应用程序.即使向用户显示权限页面并已接受,此时尚未设置权限.

当尝试第二次发布时,它会将用户带到safari中的权限页面,而requestNewPublishPermissions方法不会立即失败.用户选择确定,然后一切按预期工作.

因此,只有在第一次调用requestNewPublishPermissions时才会立即返回错误ErrorReauthorizeFailedReasonUserCancelled.

这发生在模拟器和设备上.

知道可能导致这种情况的原因吗?

Tid*_*dly 21

我找到了解决这个问题的解决方案这个问题Facebook iOS 3.1 sdk使用发布权限回调登录

 dispatch_async(dispatch_get_current_queue(), ^{
     [self openSessionForPublishPermissions];
 });
Run Code Online (Sandbox Code Playgroud)

opensessionforpublishpermissions是包含requestNewPublishPermissions方法的方法.

"原因是重新授权的调用需要在调用openActiveSession ..的事件循环之后."

我认为这是Facebook SDK中的一个错误,这是正常行为没有意义,我没有看到任何Facebook文档评论这是预期的行为.


kel*_*lin 6

我有类似的问题,答案由Tiddly为我工作.一段时间

后来我遇到了同样的问题.我不知道为什么,可能是它关注SDK或iOS更新,可能是应用程序的运行循环变得更加复杂.所以我检查了FB SDK源代码,并发现当您在读取权限之后询问发布权限时会出现问题,如下所示:

// Open with read permissions
[FBSession openActiveSessionWithReadPermissions:    readPermissions
                                   allowLoginUI:    YES
                              completionHandler:    ^
 (FBSession *session, FBSessionState status, NSError *error)
{
    // Ask for publish permissions (This is incorrect!)
    [FBSession.activeSession requestNewPublishPermissions:publishPermissions
                                          defaultAudience:FBSessionDefaultAudienceFriends
                                        completionHandler:
     ^(FBSession *session, NSError *error)
    {
        // ...
    }];
}];
Run Code Online (Sandbox Code Playgroud)

当您的应用切换到Safari或FacebookApp并返回时,会 -application: openURL: sourceApplication: annotation: 被调用.+openActiveSessionWithReadPermissions: 之后,立即调用 CompletionHandler applicationDidBecomeActive:.在你开始重新授权之后 applicationDidBecomeActive:终于被召唤了.因此,FB SDK认为用户已返回应用程序,但未授予权限,重新授权失败,并显示"com.facebook.sdk错误2".错误.

有时dispatch_async()运作良好.但强大的解决方案是等待活动会话来处理App Did Become Active事件.然后请求其他发布权限.以下是如何实现此目的的示例:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [FBAppCall handleDidBecomeActive];

    if (self.shouldReauthorise) {
       [self requestPublishPermissions];
       self.shouldReauthorise = NO;
    }
}
Run Code Online (Sandbox Code Playgroud)