2011-08-22 54 views
3

如何在程序中修復此錯誤?使用Facebook SDK。用戶未在Facebook SDK中登錄錯誤iOS

Error Domain=facebookErrDomain Code=10000 "The operation couldn’t be completed. (facebookErrDomain error 10000.)" UserInfo=0x5da9b10 {error=<CFBasicHash 0x5db09a0 [0x1087400]>{type = mutable dict, count = 2, 
entries => 
    2 : <CFString 0x5db7920 [0x1087400]>{contents = "type"} = <CFString 0x5d35420 [0x1087400]>{contents = "OAuthException"} 
    3 : <CFString 0x5d34970 [0x1087400]>{contents = "message"} = <CFString 0x5da96b0 [0x1087400]>{contents = "Error validating access token: The session is invalid because the user logged out."} 
} 
} 

回答

8

我認爲解決方案enbr張貼不完整。我將解釋原因:

當Facebook會話過期並且您繼續使用舊訪問令牌時,會返回訪問令牌錯誤。註銷不是會話過期的唯一場景(例如,更改Web中的登錄密碼)。因此,僅僅在註銷後清除用戶默認值是不夠的。

從客戶端,我們不知道我們擁有的訪問令牌是否實際上是有效的,直到響應帶有這樣的信息。因此,您需要檢測訪問令牌錯誤並通過清除舊訪問令牌和截止日期將Facebook實例恢復到工作狀態。這樣,用戶將需要再次登錄以獲取新的訪問令牌。

因此,國際海事組織,你需要做的是:

  1. 處理錯誤和當發生一個訪問令牌錯誤檢測。

  2. 當發生訪問令牌錯誤時,自動註銷並清理用戶默認設置以刪除舊的訪問令牌(步驟3)。

  3. 作爲註銷的結果,您需要清除訪問令牌和過期日期的用戶默認值(如已發佈)。

在這裏,你有一些代碼,可以用來檢測訪問令牌錯誤:

-(BOOL)isAccessTokenError:(NSError *) error { 
    if ([[error domain] isEqualToString:@"facebookErrDomain"] && [error code] == 10000) { 
     NSDictionary *userInfo = [error userInfo]; 
     NSDictionary *errorAsDictionary = [userInfo objectForKey:@"error"]; 
     if ([[errorAsDictionary objectForKey:@"type"] isEqualToString:@"OAuthException"]) { 
      //Invalid access token 
      return YES;   
     } 
    } 
    if ([[error domain] isEqualToString:@"facebookErrDomain"] && ([error code] == 110 || [error code] == 190)) { 
     //Error accessing access token 
     return YES;   
    } 
    return NO; 
} 

的地方來處理這樣的錯誤:

- (void)request:(FBRequest*)request didFailWithError:(NSError*)error; 
- (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error; 

我希望這有助於。

更新: 我忘了提。如果您正在使用SSO功能(很可能),我認爲在登錄之前清理Facebook cookie是一個非常好的主意。有時候,無效訪問令牌錯誤後,似乎登錄不會將Facebook對象恢復到工作狀態(有效訪問令牌),除非執行「乾淨登錄」。雖然不總是工作。

另外,如果您未使用SSO功能,則用於修復似乎會自動消失的ghost登錄彈出窗口。

這是我如何清潔餅乾:

NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    NSArray* facebookCookies = [cookies cookiesForURL: 
           [NSURL URLWithString:@"http://login.facebook.com"]];  
    for (NSHTTPCookie* cookie in facebookCookies) { 
     [cookies deleteCookie:cookie]; 
    } 
enter code here 
+0

h'mmm ...我有這個問題,並希望這將解決這一問題,但沒有好。我不斷收到錯誤消息,「必須使用活動訪問令牌來查詢有關當前用戶的信息。」非常令人費解。奇怪的是,它有一天運行良好,但現在我似乎被卡住了。我正在刪除存儲在UserDefaults中的Cookie和令牌信息,但即使重新登錄,我也會得到相同的錯誤。黨... – John

1

我剛剛發現了這個錯誤。這是解決方案。將此代碼放在主FBSessionDelegate(可能是您的應用程序委託)中。

- (void)fbDidLogout { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults removeObjectForKey:@"FBAccessTokenKey"]; 
    [defaults removeObjectForKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
} 

然後刪除並重新安裝應用程序!