0

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

基本上我有适用于 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 而不是传递权限,我得到了相同的结果,我必须再次登录并获得一个新令牌。但我只想获取旧会话,而不是再次为用户显示登录弹出窗口。

提前感谢您的帮助,

问候

4

1 回答 1

3

我有同样的问题。

您正在请求特殊许可user_birthday,如果您在没有让 facebook 审核您的 facebook 应用程序的情况下执行此操作,您将不会收到此信息,并且(有意或无意)您的会话将不会被缓存。这意味着您的 activeSession 将FBSessionStateCreated代替FBSessionStateCreatedTokenLoaded.

请注意,如果您在同时也是 facebook 应用程序的管理员或开发人员的 facebook 帐户上进行测试,它应该可以正常工作,因为尽管您的应用程序没有被 facebook 审核,但您将获得“user_birthday”。

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

于 2014-08-21T00:21:21.247 回答