Facebook SDK更新 - 缓存访问令牌问题

时间:2013-09-02 15:32:20

标签: ios facebook facebook-graph-api

我读了几篇关于这个问题的帖子,但我找不到解决问题的方法。

基本上我有适用于iOS的Facebook SDK“3.1.1”,我将代码更新为版本“3.5.3”。

我使用以下代码来使用缓存访问令牌:

登录后:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:accessToken forKey:FBAccessTokenKey];
[defaults setObject:expirationDate forKey:FBExpirationDateKey];
[defaults synchronize];

下次我使用之前保存的数据:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
id accessToken = [defaults objectForKey:FBAccessTokenKey];
id expirationDate = [defaults objectForKey:FBExpirationDateKey];
if (accessToken && expirationDate) {
    facebook.accessToken = accessToken;
    facebook.expirationDate = expirationDate;
}

[[FBSession activeSession] isOpen];

但是现在我不能使用相同的代码,因为新的SDK使用了FBAccessTokenData,所以我有了这个用于获取旧会话的新代码:

  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    id accessToken = [defaults objectForKey:FBAccessTokenKey];
    id expirationDate = [defaults objectForKey:FBExpirationDateKey];

  if (accessToken && expirationDate) {
    FBAccessTokenData* accessTokenData = [FBAccessTokenData createTokenFromString:accessToken permissions:nil expirationDate:expirationDate loginType:FBSessionLoginTypeFacebookApplication refreshDate:nil];
    // add the old token to the cache
    [FBSessionTokenCachingStrategy.defaultInstance cacheFBAccessTokenData:accessTokenData];
    [defaults removeObjectForKey:FBAccessTokenKey];
    [defaults removeObjectForKey:FBExpirationDateKey];
    [defaults synchronize];
  }

  // to login explicitly
  [FBSession openActiveSessionWithReadPermissions:@[ @"email", @"user_location", @"user_birthday" ] allowLoginUI:NO completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
    [self session:session updatedState:state withError:error];
}];

我在这里,因为这最后一段代码不起作用,我尝试使用nil而不是传递权限,我得到相同的结果,我必须再次登录并获得一个新令牌。 但我只想获取旧会话,而不是再次为用户显示登录弹出窗口。

提前感谢您的帮助,

此致

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。

您正在申请特殊权限user_birthday,如果您在未经Facebook审核Facebook应用程序的情况下执行此操作,则您将不会收到此信息,并且(无论是否有意)您的会话将不会被缓存。 这意味着您的activeSession将为FBSessionStateCreated而不是FBSessionStateCreatedTokenLoaded

请注意,如果您正在Facebook帐户上进行测试,该帐户也是Facebook应用程序的管理员或开发者,它应该没有任何问题,因为尽管您的应用程序未经Facebook审核,您仍将获得“user_birthday”。

要解决此问题,您可以删除user_birthday的需要或让Facebook审核您的应用。如果您要使用第一个解决方案,请不要忘记从Facebook取消对您应用的授权。