【问题标题】:openActiveSessionWithPublishPermissions / requestNewPublishPermissions publish_actions not adding permissionopenActiveSessionWithPublishPermissions / requestNewPublishPermissions publish_actions 未添加权限
【发布时间】:2015-01-25 02:41:26
【问题描述】:

使用 SDK 3.22.0。

if (FBSession.activeSession.isOpen) {
    [FBSession.activeSession
     requestNewPublishPermissions:@[@"publish_actions"]
     defaultAudience:FBSessionDefaultAudienceFriends
     completionHandler:^(FBSession *session, NSError *error) {
         NSLog(@"error = %@", error);
         NSLog(@"session open = %d", session.isOpen);
         NSLog(@"session.permissions = %@", session.permissions);
         NSLog(@"session.accessTokenData.declinedPermissions = %@", session.accessTokenData.declinedPermissions);
     }];
}
else {
    [FBSession
     openActiveSessionWithPublishPermissions:@[@"publish_actions"]
     defaultAudience:FBSessionDefaultAudienceFriends
     allowLoginUI:YES
     completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
         NSLog(@"error = %@", error);
         NSLog(@"session open = %d", session.isOpen);
         NSLog(@"status = %lu", status);
         NSLog(@"session.permissions = %@", session.permissions);
         NSLog(@"session.accessTokenData.declinedPermissions = %@", session.accessTokenData.declinedPermissions);
     }];
}

我正在与一个还没有发布权限并且也从未拒绝过的用户进行测试。在此帐户的 FB 应用程序设置中,应用程序可见性设置为“朋友”,并且发布权限甚至不在设置列表中,因为它们是针对其他用户/应用程序的。

在代码的这两种情况下,FB 应用程序都会立即打开并返回到我的应用程序,而无需询问权限。 declinedPermissions 的响应是一个带有publish_actions 的数组。

我的期望是 FB 应用会要求用户批准发布。

我收到了来自多个用户的报告,他们遇到了同样的问题 - 无法添加发布权限,但有些用户能够获得权限。

要补充的一点是,在将应用程序提交给测试组以外的用户进行 FB 批准之前,我遇到了同样的问题,但是当应用程序获得批准后,它开始为这些用户工作。现在,即使应用程序获得批准,问题似乎仍然存在,仅适用于随机用户。

我请求权限的方式有什么问题吗?

【问题讨论】:

标签: ios facebook facebook-ios-sdk facebook-permissions


【解决方案1】:

看起来这样有效:

- (BOOL)hasWritePermissions {
    if (!FBSession.activeSession.isOpen) return NO;
    return [FBSession.activeSession.permissions indexOfObject:@[@"publish_actions"]] != NSNotFound;
}

- (void)requestWritePermissions:(void(^)(BOOL status, NSError *error))callback {
    if (self.hasWritePermissions) {
        callback(YES, nil);
        return;
    }

    if (FBSession.activeSession.isOpen) {
        [FBSession.activeSession
         requestNewPublishPermissions:@[@"publish_actions"]
         defaultAudience:FBSessionDefaultAudienceFriends
         completionHandler:^(FBSession *session, NSError *error) {
             NSLog(@"error = %@", error);
             NSLog(@"session open = %d", session.isOpen);
             NSLog(@"session.permissions = %@", session.permissions);
             NSLog(@"session.accessTokenData.declinedPermissions = %@", session.accessTokenData.declinedPermissions);

             if (self.hasWritePermissions) {
                 callback(YES, nil);
             }
             else {
                 callback(NO, error);
             }
         }];
    }
    else {
        [FBSession
         openActiveSessionWithPublishPermissions:@[@"publish_actions"]
         defaultAudience:FBSessionDefaultAudienceFriends
         allowLoginUI:YES
         completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
             NSLog(@"error = %@", error);
             NSLog(@"session open = %d", session.isOpen);
             NSLog(@"status = %u", status);
             NSLog(@"session.permissions = %@", session.permissions);
             NSLog(@"session.accessTokenData.declinedPermissions = %@", session.accessTokenData.declinedPermissions);

             [self requestWritePermissions:callback]; // this time, with an open session
         }];
    }
}

如果没有会话,我运行openActiveSessionWithPublishPermissions,然后再次运行requestNewPublishPermissions

问题是openActiveSessionWithPublishPermissions 触发回调甚至没有去 Facebook 应用程序以获得更多权限(看起来像 FB 错误,将报告),但这种方法似乎可以解决它。

我发现的另一个问题是 session.permissions 并不总是反映 Facebook 上的权限。我发现确保我拥有最新权限的唯一方法是发出 API 请求:

[FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {

并检查 result.data 数组的授予/拒绝权限。

【讨论】:

  • 上面唯一的问题是每次活动会话发生变化时都会调用“openActiveSessionWithPublishPermissions”中的completionHandler(根据FB文档)。 >>>>>>>> 当会话无效或经历其他状态转换时,许多应用程序将受益于通知。如果提供了一个块,则 FBSession 对象将在每次会话更改状态时调用该块。
【解决方案2】:

我对这种方法也有类似的问题。我最终以全套权限(读取和写入)打开会话,它解决了我的问题。

-(void)requestPublishPermissionsWithCompletion:(FBHandlerComp)completion{

if (self.session.isOpen && [self.session.permissions  containsObject:@"publish_actions"]){
    //we have an open session and all neceassarry pemissions
    completion(true,nil);
}else{
    //something in missing, to account to all diffrent scenarios (missing persmission, expired tokens, changes in user sessting etc..), we reinisilise the session and request permissions

      //for publish permissions we need to ask for the whole set( read& publish)
    NSMutableArray *permissions = [NSMutableArray arrayWithArray:self.writePersmissions];
    [permissions addObjectsFromArray:self.readPersmissions];


    self.session = [[FBSession activeSession]initWithAppID:nil permissions:permissions defaultAudience:FBSessionDefaultAudienceFriends urlSchemeSuffix:nil tokenCacheStrategy:nil];

    [self openFacebookSessionWithCompleteion:^(BOOL result, NSError *error) {    
    if (result) {

        completion(true,nil);

    }else{
        if (LOGGING_IS_ON) DebugLog(@"could not get publish permissions- could not open session %@",error);
         completion(false,nil);
    }
}];

}

}

【讨论】:

  • openFacebookSessionWithCompleteion 中有什么内容?
猜你喜欢
  • 2014-11-06
  • 2018-10-13
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
相关资源
最近更新 更多