Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios openActiveSessionWithPublishPermissions/requestNewPublishPermissions发布\未添加权限的操作_Ios_Facebook_Facebook Ios Sdk_Facebook Permissions - Fatal编程技术网

Ios openActiveSessionWithPublishPermissions/requestNewPublishPermissions发布\未添加权限的操作

Ios openActiveSessionWithPublishPermissions/requestNewPublishPermissions发布\未添加权限的操作,ios,facebook,facebook-ios-sdk,facebook-permissions,Ios,Facebook,Facebook Ios Sdk,Facebook Permissions,使用SDK 3.22.0 if (FBSession.activeSession.isOpen) { [FBSession.activeSession requestNewPublishPermissions:@[@"publish_actions"] defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *session, NSError *error)

使用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应用程序设置中,应用程序可见性设置为“Friends”,发布权限甚至不在设置列表中,因为其他用户/应用程序的发布权限

在这两种情况下,FB应用程序都会立即打开并返回到我的应用程序,而无需请求权限。
declinedPermissions
的响应是一个带有
publish\u操作的数组

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

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

需要补充的一点是,在向测试组以外的用户提交应用程序供FB批准之前,我也遇到了同样的问题,但当应用程序获得批准后,它开始为这些用户工作。现在看来,即使该应用程序获得批准,问题依然存在,只是针对随机用户


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

我也有类似的问题。我最终以一整套权限(读写)打开了会话,解决了我的问题

-(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);
    }
}];

}

}

看起来这样很有效:

- (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 bug,将会报告),但这种方法似乎解决了这个问题

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

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

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

这是否可在所有新用户中复制,还是仅在某些用户中复制?您可以随时在报告中提交错误:
openFacebookSessionWithCompleteion
中有什么内容?上面唯一的问题是,每次活动会话发生更改时,都会调用“openActiveSessionWithPublishPermissions”中的completionHandler(根据FB文档)。>>>当会话无效或经历其他状态转换时,许多应用程序将受益于通知。如果提供了块,FBSession对象将在每次会话更改状态时调用该块。