2013-03-04 24 views
3

我使用Facebook iOS SDK(版本3.2),並且一切正常,直到用戶進入Facebook並從授權應用程序列表中刪除應用程序。在那時,我仍然使用緩存會話登錄,即使它實際上不再有效。強制清除訪問令牌並再次登錄也會導致使用相同的舊訪問令牌。Facebook iOS SDK 3.2,當用戶從Facebook.com移除應用程序時出現問題

現在在application:didFinishLaunchingWithOptions:我有這樣的代碼來測試會話:

// Relogin with cached session 
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) { 
    NSLog(@"We're logged in to Facebook!"); 

    [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:NO completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
     NSLog(@"accessToken: %@", session.accessTokenData.accessToken); 
     NSLog(@"status: %i", status); 
     NSLog(@"error: %@", error); 

     switch (status) { 
      case FBSessionStateOpen: 
       NSLog(@"FBSessionStateOpen"); 
       NSLog(@"permissions: %@", session.permissions); 
       break; 

      case FBSessionStateClosed: 
      case FBSessionStateClosedLoginFailed: 
       [session closeAndClearTokenInformation]; 
       [Utilities presentMessage:@"Facebook login failed" withTitle:@"Error" level:MessageLevelError]; 
       break; 

      default: 
       break; 
     } 
    }]; 
} 

我每次啓動應用程序,它說我仍然登錄時使用的user_birthday和電子郵件的權限。但是,當我嘗試使用accessToken打開https://graph.facebook.com/me?access_token=xxx時,它返回「錯誤驗證訪問令牌:用戶123未授權應用程序123」。

使用[FBSession.activeSession closeAndClearTokenInformation];清除令牌並強制進行新的登錄不會有幫助,我總是以完全相同的舊accessToken結束。

還有一個類似的問題(Facebook SDK 3.1 iOS: Handle login if user remove app from Facebook Settings),但它表示「然後,用戶關閉iOS應用程序並重新啓動它......通過此次重新啓動,iOS應用程序」已修復「並檢測到用戶是否更長時間登錄「。我根本沒有這種行爲。

這是我打開第一會議地點:

- (void)openFBSession { 
    NSArray *perm = @[ @"user_birthday", @"email" ]; 

    [FBSession openActiveSessionWithReadPermissions:perm allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { 
     DLog(@"accessToken: %@", session.accessTokenData.accessToken); 
     DLog(@"status: %i", status); 
     DLog(@"error: %@", error); 

     switch (status) { 
      case FBSessionStateOpen: 
       DLog(@"FBSessionStateOpen"); 
       // this is where I need to use session.accessTokenData.accessToken, which is stale 
       break; 

      case FBSessionStateClosed: 
      case FBSessionStateClosedLoginFailed: 
       [FBSession.activeSession closeAndClearTokenInformation]; 
       [Utilities presentMessage:@"Facebook login failed" withTitle:@"Error" level:MessageLevelError]; 
       break; 

      default: 
       break; 
     } 
    }]; 
} 
+0

在這種情況下,您是否收到錯誤消息?你能否檢查完成處理程序的錯誤是否已設置? – 2013-03-05 00:36:48

+0

永不發生任何錯誤。 – 2013-03-05 09:31:40

回答

1

如果Facebook的SDK並沒有發現令牌是無效的,而這樣做在自己的Facebook圖形API請求,您需要強制iOS檢查其標記。

當你調用你自己的服務器API(並給它代幣)並代表用戶在那裏打電話時,這很有用。如果您發現該令牌在此處無效,則告知iOS 6該令牌無效的唯一方法就是這樣做:

// Only do this if there is native Facebook Account support (iOS 6+) 
BOOL isFacebookAccountsAvailable = (&ACAccountTypeIdentifierFacebook != NULL); 
if (isFacebookAccountsAvailable) { 
    ACAccountStore *accountStore = [ACAccountStore new]; 
    ACAccountType *accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; 
    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB]; 

    for (ACAccount *fbAccount in fbAccounts) 
     [accountStore renewCredentialsForAccount:fbAccount completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) { 
      DLog(@"Renew account error: %@", error.localizedDescription) 
     }]; 
} 
相關問題