6

我正在尝试从使用 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
         }
     }];

我第一次调用此代码时,它会将用户带到权限页面,甚至在它切换到设备上的 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,

然后,该应用程序继续在 Safari 中显示用户选择确定的权限页面。然后它返回到应用程序。即使向用户提供了权限页面并被接受,此时尚未设置权限。

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

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

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

知道可能是什么原因造成的吗?

4

2 回答 2

21

我在这个问题的答案中找到了解决这个问题的方法Facebook iOS 3.1 sdk login with publish permission callbacks

 dispatch_async(dispatch_get_current_queue(), ^{
     [self openSessionForPublishPermissions];
 });

其中 opensessionforpublishpermissions 是包含 requestNewPublishPermissions 方法的方法。

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

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

于 2013-06-07T10:11:06.890 回答
6

我遇到了类似的问题,Tiddly 提供的答案对我有用。有一段时间。

后来我遇到了同样的问题。不知道为什么,可能是因为 SDK 或者 iOS 的更新,可能是应用的 run loop 变得更复杂了。因此,我检查了 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)
    {
        // ...
    }];
}];

当您的应用程序切换到 Safari 或 FacebookApp 并返回时, -application: openURL: sourceApplication: annotation: 将调用。在此之后立即调用的 CompletionHandler +openActiveSessionWithReadPermissions: , before 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;
    }
}
于 2014-12-11T16:03:30.873 回答