1

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

4

1 回答 1

1

看起来您的策略是返回一个没有权限的 FBAccessTokenData (这对于您的目的而言并非完全不合理,除非您还要存储权限)。但是,当您启动会话时,指定“basic_info”(虽然通常是一个很好的最佳实践,并且在要求登录会提示 UI 时需要)将导致它检查“basic_info”是否包含在缓存的令牌中。既然不是,它就不会加载缓存的令牌。出于您的目的,您应该能够使用 nil 权限数组来初始化会话。

于 2013-09-05T20:50:12.587 回答