我读了几篇关于这个问题的帖子,但我找不到解决问题的方法。
基本上我有适用于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而不是传递权限,我得到相同的结果,我必须再次登录并获得一个新令牌。 但我只想获取旧会话,而不是再次为用户显示登录弹出窗口。
提前感谢您的帮助,
此致
答案 0 :(得分:3)
我遇到了同样的问题。
您正在申请特殊权限user_birthday
,如果您在未经Facebook审核Facebook应用程序的情况下执行此操作,则您将不会收到此信息,并且(无论是否有意)您的会话将不会被缓存。
这意味着您的activeSession将为FBSessionStateCreated
而不是FBSessionStateCreatedTokenLoaded
。
请注意,如果您正在Facebook帐户上进行测试,该帐户也是Facebook应用程序的管理员或开发者,它应该没有任何问题,因为尽管您的应用程序未经Facebook审核,您仍将获得“user_birthday”。
要解决此问题,您可以删除user_birthday
的需要或让Facebook审核您的应用。如果您要使用第一个解决方案,请不要忘记从Facebook取消对您应用的授权。