我正在尝试使用自定义令牌缓存机制构建iOS应用程序。我在设备上对FB进行身份验证,然后将FB访问令牌存储在服务器上的会话令牌上,然后从服务器发出FB API请求。
FB登录正常。我能够将令牌缓存到我的服务器上。但是当我登录FB后下次运行应用程序时,真正的问题就出现了。
这是我检查我的应用是否已登录FB的流程。
1)在我的服务器上点击一个url,为我的应用程序获取给定会话令牌的FBAccessToken。这是一个异步请求。 2)触发异步请求回调。如果存在令牌,请将其缓存在我的自定义FBSessionTokenCachingStrategy类中。 3)在回调中,我使用:
初始化FBSession对象FBSession *session = [[FBSession alloc] initWithAppID:nil permissions:@[@"basic_info"] urlSchemeSuffix:nil tokenCacheStrategy:self.tokenCache];
然后,我检查session.state。如果我得到一个FBSessionCreatedTokenLoaded,那么我决定继续使用openBehaviour方法。但是,即使在服务器上缓存了令牌并且fetchFBAccessTokenData返回FBAccessTokenData对象,我也会获得FBSessionStateCreated而不是FBSessionStateCreatedTokenLoaded。
不知道为什么会这样?
这是我自定义FBSessionTokenCachingStrategy类的fetchFBAccessTokenData方法的实现:
-(FBAccessTokenData*) fetchFBAccessTokenData {
NSLog(@"Fetching FB Access token");
if (self.fbTokenData != nil) {
NSLog(@"Found FB Token");
FBAccessTokenData *fbTokenData = [FBAccessTokenData createTokenFromString: [self.fbTokenData objectForKey:@"fb_token"] permissions:nil expirationDate:nil loginType:1 refreshDate:nil];
NSLog(@"%@",fbTokenData.accessToken);
return fbTokenData;
}
return nil;
}
它返回一个FBAccessTokenData对象,但我仍然得到一个不正确的会话状态。
是否会发生这种情况,因为我没有正确返回缓存的令牌?我正在基于FB IOS SDK文档中为自定义缓存提供的标准示例实现我的代码。
答案 0 :(得分:1)
看起来您的策略是返回一个没有权限的FBAccessTokenData(除非您同时存储权限,否则这对您的目的来说并非完全不合理)。但是,当您初始化会话时,指定“basic_info”(虽然通常是一个很好的最佳实践,并且在请求登录时需要提示UI)将导致它检查缓存令牌中是否包含“basic_info”。由于它不是,它不会加载缓存的令牌。出于您的目的,您应该能够使用nil权限数组初始化会话。