Ios openActiveSessionWithPublishPermissions/requestNewPublishPermissions发布\未添加权限的操作
使用SDK 3.22.0Ios 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)
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对象将在每次会话更改状态时调用该块。