我正在尝试使用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中显示权限页面,用户选择ok。然后它返回到应用程序。即使向用户显示了权限页面并已接受,此时也未设置权限。
当尝试第二次发布时,它会将用户带到safari中的权限页面,而requestNewPublishPermissions方法不会立即失败。用户选择确定然后一切都按预期工作。
因此,只有在第一次调用requestNewPublishPermissions时才会立即返回错误ErrorReauthorizeFailedReasonUserCancelled。
这发生在模拟器和设备上。
知道可能导致这种情况的原因吗?
答案 0 :(得分: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文档评论这是预期的行为。
答案 1 :(得分: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)
{
// ...
}];
}];
当您的应用切换到Safari或FacebookApp并返回时,
-application: openURL: sourceApplication: annotation:
叫做。 CompletionHandler of
+openActiveSessionWithReadPermissions:
之后立即打电话
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;
}
}