没有我在读(FB许多开发文章和SO问题)帮助,所以我想我会在这里发表。 我试图让这一切都与iOS 6和Facebook SDK 3.1.1工作。
我有一个非常基本的设置:我的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. }
- 我需要做什么做这样的事情只是工作? 我读过 ,在SDK 3.1.1 FBSession只会照顾它,但是这似乎并不像这种情况。 我的访问令牌到期,一旦这样做,的iOS / FB SDK不会给我回一个刷新。
- 即使注销(它调用
[FBSession.activeSession closeAndClearTokenInformation]
不解决这个问题。 我已经能够做的唯一的事情就是在iPhone模拟器首“重置内容和设置”,重新输入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];
}
}
...
}