2015-01-25 16 views
1

SDK 3.22.0 사용.openActiveSessionWithPublishPermissions/requestNewPublishPermissions 권한을 추가하지 않은 publish_actions

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 Apps 설정에서 앱 공개 설정은 '친구'로 설정되고 게시 권한은 다른 사용자/앱의 설정 목록에도 포함되지 않습니다.

코드의 두 경우 모두 FB 응용 프로그램이 열리고 권한 요청없이 즉시 내 응용 프로그램으로 돌아갑니다. declinedPermissions의 응답은 publish_actions 인 배열입니다.

제 기대는 FB 앱이 사용자에게 게시 승인을 요청할 것입니다.

게시자 권한을 추가 할 수 없지만 일부 사용자는 권한을 얻을 수있는 동일한 문제를 경험 한 여러 사용자의 보고서를 받았습니다.

내가 추가해야 할 한 가지는 테스트 그룹 외부의 사용자와 FB 승인을 위해 앱을 제출하기 전에 동일한 문제가 있었지만 앱이 승인되면 해당 사용자에 대해 작업하기 시작했습니다. 이제는 앱이 승인 된 경우에도 문제가 지속되는 것처럼 보이며 임의의 사용자에게만 허용됩니다.

권한을 요청하는 방식에 문제가 있습니까?

+0

모든 신규 사용자 또는 일부 사용자에게 재현 가능합니까? 언제든지 https://developers.facebook.com/bugs에서 버그를 신고 할 수 있습니다. –

+0

보고 : https://developers.facebook.com/bugs/342971669223974/ – elado

답변

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

} 

}를 보이는 :

- (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이 더 많은 권한 (FB 버그처럼 보입니다)으로 Facebook 앱에 갈 필요없이 콜백을 실행하고 있지만이 방법으로 해결할 수 있습니다.

내가 발견 한 또 다른 문제점은 session.permissions가 Facebook에 대한 사용 권한을 항상 반영하지 않는다는 것입니다. 나는 최신 권한을 가지고 있는지 확인하기 위해 발견하는 유일한 방법은 API 요청을 발행하는 것입니다

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

및 부여에 대한 result.data 배열을 확인/권한을 거절했다.

+0

위의 유일한 우려 사항은 "openActiveSessionWithPublishPermissions"의 completionHandler가 활성 세션에서 변경 될 때마다 (FB 설명서에 따라) 호출된다는 사실입니다. >>>>>>>> 세션이 잘못되어 이되거나 다른 상태 전환이 발생할 경우 많은 응용 프로그램에서 알림을 유용하게 사용할 수 있습니다. 블록이 제공되면 FBSession 개체는 세션이 상태를 바꿀 때마다 블록을 호출합니다. – Pichirichi

0

나는이 방법으로 비슷한 문제가있었습니다. 나는 사용 권한의 전체 집합 (읽기 & 쓰기)와 세션을 여는 끝나고 내 문제를 해결. 이 일을 같이

+0

'openFacebookSessionWithCompleteion'에 무엇이 있습니까? – elado

+0

나는 그것을 시도했지만 효과가 없었다. – elado