我正在尝试使用自定义令牌缓存机制构建 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 文档中为自定义缓存给出的标准示例来实现我的代码。