2012-10-16 69 views
16

我遇到了登錄與Facebook的發佈權限3.1的ios sdk。Facebook的iOS 3.1 sdk登錄與發佈權限回調

我的應用程序有一個共享視頻的按鈕,當用戶點擊它時我想添加基本+發佈權限。據我瞭解,我必須做兩個通話 -

  1. openActiveSessionWithReadPermissions,然後
  2. reauthorizeWithPublishPermissions

這是我現在使用的代碼:

//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,一次使用來自openSessionForPublishPermissions調用的FBSessionStateOpenTokenExtended),一次當第一次嘗試登錄應用程序時,我得到ErrorReauthorizeFailedReasonUserCancelled(如果O之前刪除了所有應用程序權限)。

什麼是實現此登錄的正確方法?該應用程序不需要Facebook登錄,除了這一功能,所以登錄過程應該在同一按鈕上。

謝謝!

+0

+1我們陷入了同樣的問題,特別是因爲混合權限調用被取消。 –

+0

reauthorizeWithPublishPermissions折舊。改爲使用 requestNewPublishPermissions。 – John

回答

26

我跑過這個相同的問題。我找到的解決方案是將調用[self openSessionForPublishPermissions];包裝在dispatch_async塊中。

實施例:

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

的原因是,該呼叫重新授權..需要是事件循環其中openActiveSession ..被稱爲後。

+0

謝謝!這個bug已經讓我頭痛了好幾天。 – Tiddly

0

這可能是一個超時斷點的機會嗎?遇到此錯誤一次,但在斷點停用後再次運行。