2012-10-16 5 views
16

Facebook의 3.1 ios sdk에 게시 권한으로 로그인하는 데 문제가 있습니다.게시 권한 콜백이 포함 된 iOS 3.1 sdk 로그인

내 앱에는 동영상을 공유하는 버튼이 있으며, 사용자가 클릭하면 기본 + 퍼블리싱 권한을 추가하고 싶습니다. 내가 알고있는 것처럼, 난 두 호출 할 필요가 -

  1. openActiveSessionWithReadPermissions을하고
  2. reauthorizeWithPublishPermissions
  3. 여기

내가 지금 사용하고 코드입니다 : 나는 것을 볼 수

//Opens a Facebook session and optionally shows the login UX. 
- (void)openSessionForReadPermissions 
{ 
    [FBSession openActiveSessionWithReadPermissions:nil 
             allowLoginUI:YES 
            completionHandler: 
    ^(FBSession *session, 
     FBSessionState state, NSError *error) { 

     //this is called even from the reauthorizeWithPublishPermissions 
     if (state == FBSessionStateOpen && !error) 
     { 
      [self openSessionForPublishPermissions]; 
     } 
     else if (state == FBSessionStateClosedLoginFailed) 
     { 
      [FBSession.activeSession closeAndClearTokenInformation]; 

      [[NSNotificationCenter defaultCenter] postNotificationName:FBLoginErrorNotification object:session]; 
     } 
    }]; 
} 

-(void)openSessionForPublishPermissions 
{  
    NSArray* permissions = [NSArray arrayWithObject:@"publish_stream"]; 

    [[FBSession activeSession] reauthorizeWithPublishPermissions:permissions 
               defaultAudience:FBSessionDefaultAudienceFriends 
               completionHandler: 
    ^(FBSession *session, NSError *error) 
    { 
     if (!error) 
     { 
      [[NSNotificationCenter defaultCenter] 
       postNotificationName:FBLoginSuccessNotification 
       object:session]; 
     } 
     else 
     { 
      [[NSNotificationCenter defaultCenter] 
       postNotificationName:FBLoginErrorNotification 
       object:session]; 
     } 
    }]; 
} 

은 openSessionForReadPermissions의 블록은 두 번 호출됩니다 (한 번 FBSessionStateOpen을 사용하고 한 번 FBSessionStateOpenTokenExtended를 openSessionForPublishPermissions 호출에서 사용). n 먼저 응용 프로그램에 로그인하려고 시도 할 때 ErrorReauthorizeFailedReasonUserCancelled가 나타납니다 (O가 이전에 모든 응용 프로그램 권한을 삭제 한 경우).

이 로그인을 구현하는 적절한 방법은 무엇입니까? 이 기능을 제외하고 응용 프로그램은 페이스 북 로그인을 요구하지 않으므로 로그인 프로세스는 동일한 버튼 푸시로 이루어져야합니다.

감사합니다.

+0

+1 우리는 동일한 문제에 봉착했습니다. 특히 혼합 된 권한 호출이 부적절하기 때문에 더욱 그렇습니다. –

+0

reauthorizeWithPublishPermissions가 감가 상각됩니다. 대신 requestNewPublishPermissions를 사용하십시오. – John

답변

26

동일한 문제가 발생했습니다. 내가 찾은 해결책은 [self openSessionForPublishPermissions];에 대한 호출을 dispatch_async 블록에 래핑하는 것이 었습니다.

예 :

dispatch_async(dispatch_get_current_queue(), ^{ 
    [self openSessionForPublishPermissions]; 
}); 

이유는 통화 .. .. openActiveSession가 호출되는 이벤트의 루프 후에 있어야 재 인증이다.

+0

고마워요! 이 버그는 며칠 동안 내 머리를 망가 뜨 렸습니다. – Tiddly

0

언제든지 중단 점을 치는 데 시간 초과가 될 수 있습니까? 이 오류는 한 번 발생했지만 중단 점을 사용하지 않고 실행 한 후에 다시는 발생하지 않았습니다.

관련 문제