Facebook iOS:requestNewPublishPermissions未要求用户获取新权限

4

我在使用SDK版本3.17时遇到了requestNewPublishPermissions的问题。Facebook文档建议先使用只读权限登录,然后再请求写入权限,这就是我正在尝试做的。我可以通过以下代码让用户成功登录:

[FBSession openActiveSessionWithReadPermissions:@[@"public_profile"]
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error)
{
     // Handler for session state changes
     // This method will be called EACH time the session state changes,
     // also for intermediate states and NOT just when the session open
     [self sessionStateChanged:session state:state error:error];
}];

当我想要发布到时间线时,我使用下面的代码请求扩展权限。应用程序将通过Facebook网页将其跳转到Safari。但是该网页没有要求写入权限,只是说该应用程序已经获得了授权。然后当我点击“确认”并控制返回应用程序时,我没有发布权限。请查看下面的“这就是它的结局!”。
我已经尝试过进入facebook.com并删除“应用程序”下已授予的权限,但没有任何效果。我还尝试过发布,但出现错误提示说我没有正确的权限。
有什么建议吗?
- (void) requestPublishPermission:(void (^)(void)) action
{
    // Request publish_actions
    [FBSession.activeSession requestNewPublishPermissions:[NSArray arrayWithObject:@"publish_actions"]
                                          defaultAudience:FBSessionDefaultAudienceFriends
                                        completionHandler:^(FBSession *session, NSError *error)
     {
         if (!error)
         {
             if ( [FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound )
             {
                 // this is where it ends up!
             }
             else
             {
                 // Permission granted, publish the story
                 action();
             }
         }
         else
         {
             // permission denied, alert user
         }
     }];
}

我现在也有同样的问题 X( 你找到解决方案了吗? - JohnyDgoode
不,我从来没有这样做过。如果我没记错的话,我使用了原生的 Facebook 分享 GUI 作为解决方法。 - Henning
我明白了,非常感谢! - JohnyDgoode
2个回答

2

您需要将登录的用户添加为开发者/测试人员。或者您需要将应用程序提交到 Facebook 进行审核。


这是一个真实但部分的情况。如果“publish_actions”尚未获得批准或FB应用程序仅为特定FB应用程序的开发人员获得FB批准屏幕,则可能会发生这种情况。在用户使用FB Web客户端的情况下,会话将关闭,重新调用打开会话,但新权限不会添加到会话中。 - Pichirichi

0

我也遇到了同样的问题,只有在用户不使用FB应用程序且所有操作都通过Web进行时才会出现。这是我解决问题的方法:

typedef void(^facebookPostCompBlock)(FBSession *session, NSError* err, BOOL publishActionPermissions);

- (void) obtainPostPermissionsWithComplition:(facebookPostCompBlock) comp {
    if ([[FBSession activeSession] isOpen]) {

        if ([[[FBSession activeSession] permissions]indexOfObject:@"publish_actions"] == NSNotFound) {
            [FBSession.activeSession requestNewPublishPermissions:@[@"publish_actions"]
                                                  defaultAudience:FBSessionDefaultAudienceFriends
                                                completionHandler:^(FBSession *session, NSError *error)

             {
                 BOOL gotPublishActionPermissions = TRUE;
                 if ([[[FBSession activeSession] permissions]indexOfObject:@"publish_actions"] == NSNotFound) {
                     gotPublishActionPermissions = FALSE;                     
                 }
                 if (comp) {
                     comp(session,error,gotPublishActionPermissions);
                 }
             }];
        } else {
            if (comp) {
                comp([FBSession activeSession],nil,TRUE);
            }
        }
    } else {
        BOOL openedSynchronously = [FBSession openActiveSessionWithPublishPermissions:@[@"publish_actions"]
                                           defaultAudience:FBSessionDefaultAudienceFriends
                                              allowLoginUI:YES
                                         completionHandler:^(FBSession *session, FBSessionState status, NSError *error)
        {
            if (!error && status == FBSessionStateOpen) {
                [self obtainPostPermissionsWithComplition:comp];
            } else {
                BOOL gotPublishActionPermissions = TRUE;
                if ([[session permissions]indexOfObject:@"publish_actions"] == NSNotFound) {
                    gotPublishActionPermissions = FALSE;
                    BLog(@"+ NOT FOUND +");
                } else {
                   if (comp) {
                       comp(session,error,gotPublishActionPermissions);
                   }
                }
            }
        }];
    }
}

以下内容中唯一需要考虑的问题(需要一个故障保护)是会话将在打开和关闭之间不断切换,从而导致循环。

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