2012-10-05 59 views
14

在此之前,我已經閱讀了thisthis問題以解決下面和問題之前的問題。在Facebook中使用FBSession openActiveSessionWithReadPermissions處理無效的accessToken iOS 3.1.1 SDK

我的問題是,當的accessToken被過期(因爲到期日通過,或者通過手動刪除從我的Facebook應用中心的應用程序)下面的代碼:

if ([[FBSession activeSession] isOpen]) { 
     //do something 
    } 
else { 
     [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
      if(FB_ISSESSIONOPENWITHSTATE(status)) { 
       //do something 
      } 
      } 
     }]; 
    } 

獲取else塊用FBSession.activeSession打開,但執行'做某事'時,accessToken無效,因此請求獲得錯誤:HTTP狀態碼:400. 當我嘗試整個過程立即執行兩次FBSession請求權限(UIAlertView for iOS6在Safari中集成了Facebook,Facebook App或Facebook網站),其餘部分運行順利。

我的問題是爲什麼我必須做兩件事才能正常工作,以及爲什麼Facebook SDK在第一次無法檢測到activeSession和accessToken無效時。

謝謝大家提前!

回答

22

您鏈接的問題是相關的,尤其是Facebook SDK 3.1 - Error validating access token,它解釋了設備上的Facebook帳戶與服務器不同步的問題(即,如果您從App Center中刪除了應用程序)。如上所述,在3.1.1中,只有當SDK收到來自服務器的無效響應時,SDK纔會調用它來更新設備令牌。這對於減少服務器往返次數來說是一種折衷。

假設你的代碼塊在applicationDidFinishLaunching或類似的東西上執行,它將會去else塊,因爲應用程序以新會話開始。當它調用openActiveSessionWithReadPermissions時,iOS 6設備認爲該標記是有效的,並且會讓狀態進入打開狀態,這樣就可以執行「執行某些事情」。只有這樣,SDK纔會從服務器獲取無效響應並使設備令牌無效。因此,下一次調用該過程時,它將提示用戶再次進行適當的授權。

這是故意的。現在,如果錯誤代碼描述了無效標記,則可以考慮在應用程序中自動重試。例如,請參閱Scrumptious示例postOpenGraph重試代碼。在你的情況下,它可能看起來更接近於類似的信息(我用requestForMe的「有所作爲」用於演示目的):

else { 
    [FBSessionopenActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
     if(FB_ISSESSIONOPENWITHSTATE(status)) { 
      //do something 
      [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
       if (!error){ 
        NSLog(@"success on first try"); 
       } else if ([[error userInfo][FBErrorParsedJSONResponseKey][@"body"][@"error"][@"code"] compare:@190] == NSOrderedSame) { 
        //requestForMe failed due to error validating access token (code 190), so retry login 
        [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
         if (!error){ 
          //do something again, or consider recursive call with a max retry count. 
          NSLog(@"success on retry"); 
         } 
        }]; 
       } 
      }]; 
     } 
    }]; 
} 
+1

非常感謝克里斯!它似乎工作,但不是第二次重試,但與第四次。我認爲它會在下一次SDK更新中修復。 – ozzotto

+0

獲取錯誤代碼的方法似乎並不可靠。我認爲JSON格式不一致:錯誤域= com.facebook.sdk代碼= 5「操作無法完成(com.facebook.sdk錯誤5)」UserInfo = 0x12c81710 {com.facebook.sdk :ParsedJSONResponseKey =( { 體= { 誤差= { 代碼= 190; 消息= 「接入令牌無效的設備上。」; 類型= OAuthException; }; }; 代碼= 400; } ),com.facebook.sdk:HTTPStatusCode = 400} – MaxGabriel

+0

- [__ NSArrayM objectForKeyedSubscript:]:無法識別的選擇器發送到實例 – MaxGabriel

相關問題