沒有我在讀(FB許多開發文章和SO問題)幫助,所以我想我會在這裏發表。我試圖讓這一切都與iOS 6和Facebook SDK 3.1.1一起工作。的iOS 6的Facebook登錄不刷新訪問令牌
我有一個非常基本的設置:我的iOS應用與Facebook進行身份驗證,我通過到的access_token我的服務器,現在的用戶登錄到我的應用程序。他們唯一能做的與Facebook有關的其他事情是在牆上張貼一些東西。我正在使用傳統的對話窗口,因此用戶可以添加自己的註釋。
一切完美的作品上了一個新安裝的第一個小時左右。如果用戶通過iOS設置應用程序登錄,他們會看到一個快速的iOS確認框,我得到他們的令牌,將它發送到我的服務器,我們都很好。
如果我貼我收到到Facebook的訪問令牌調試令牌,它表明,它會在一個小時內到期。
如果我等待這一個小時,回來到應用程序之後,任何事情我嘗試這樣做給了我這個錯誤:
{"error_code":190,"
error_msg":"Error validating access token:
Session has expired at unix time 1351497600.
The current unix time is 1351525180. }
- 什麼,我需要做這樣的事情只是工作? I've read在SDK 3.1.1中,FBSession只會照顧它,但看起來並不是這樣。我的訪問令牌即將過期,一旦這樣做,iOS/FB SDK將不會給我一個刷新的令牌。
- 即使註銷(它調用
[FBSession.activeSession closeAndClearTokenInformation]
)不解決這個問題。我能做的唯一事情就是iOS模擬器偏好設置中的「重置內容和設置」,在Settings.app中重新輸入我的FB憑證,然後重建我的應用程序。只有這樣我才能得到另一個令牌,它將在一個小時內過期。
散記:
- 當我的應用程序恢復,我打電話
[FBSession.activeSession handleDidBecomeActive]
和[self.facebook extendAccessTokenIfNeeded]
- 根據鏈接到上面的SO問題,SDK應自動調用
FBSession#renewSystemAuthorization
。我在裏面放了一個NSLog,我從來沒有看到這個方法被調用。
更新#1:
我提到了我讀過的SDK將處理無效/過期的令牌。這似乎應該發生在FBRequestConnection#completeWithResults:orError :.有關代碼路徑的註釋,請參閱行內註釋。
- (void)completeWithResults:(NSArray *)results
orError:(NSError *)error
{
int count = [self.requests count];
for (int i = 0; i < count; i++) {
FBRequestMetadata *metadata = [self.requests objectAtIndex:i];
id result = error ? nil : [results objectAtIndex:i];
NSError *itemError = error ? error : [self errorFromResult:result];
id body = nil;
if (!itemError && [result isKindOfClass:[NSDictionary class]]) {
NSDictionary *resultDictionary = (NSDictionary *)result;
body = [FBGraphObject graphObjectWrappingDictionary:[resultDictionary objectForKey:@"body"]];
}
...
// *******************************************
// My code actually falls into this block, proving that I do in fact have an invalid session
// *******************************************
if ([self isInvalidSessionError:itemError
resultIndex:error == itemError ? i : 0]) {
[metadata.request.session closeAndClearTokenInformation:itemError];
// *******************************************
// Unfortunately metadata.request.session is nil, so this condition is never
// run, so renewySystemAuthorization is never called
// *******************************************
if (metadata.request.session.loginType == FBSessionLoginTypeSystemAccount){
[FBSession renewSystemAuthorization];
}
}
...
}
你確定這是一個長期存取令牌嗎?當您將令牌輸入到[Debugger](https://developers.facebook.com/tools/debug)時,過期日期會說明什麼。我的長壽令牌說「過期:1356716436(大約2個月)」 –
嗯,這很有趣。好主意。將其插入調試器(對於那些不知道的人:https://developers.facebook.com/tools/debug)說:「過期時間:1351540800(大約一個小時)」。我覺得我已經非常仔細地關注了SDK文檔和示例。我的應用程序在第一個小時內運行良好,但在此之後,我無法獲得新的令牌。有任何想法嗎? – djibouti33
您能提供有關您的應用程序儀表板設置的信息嗎?作爲示例,您在「高級」>「身份驗證」部分中的設置如何。還有什麼與您在設置中可以想到的文檔不同? –