0

在我的 Canvas 应用程序(标签页)中,如果应用程序需要,我使用此代码获取 AccessToken:

var accessToken = "";
FB.getLoginStatus(function (response) {
  if (response.authResponse || response.status === 'connected') {
    accessToken = response.authResponse.accessToken;
  }else {
    alert( response.status );
  }
} ); 
return accessToken;

我工作正常。但是,如果用户打开应用程序并将其放置大约 30 分钟(或更少或更多,只是很长一段时间),则此函数无法获取 accessToken 只是返回一个空字符串。在控制台日志中没有任何错误。如果用户刷新页面后一切都很好......

我应该怎么做才能随时获取accessToken?

4

2 回答 2

1

这是发生了什么:

FB.getLoginStatus方法是异步完成的,您给它一个回调以在完成后执行
在您的代码中,您accessToken在发出异步请求后返回正确的,但您并没有等待它完成。
它应该看起来像:

FB.getLoginStatus(function (response) {
    if (response.authResponse || response.status === 'connected') {
        return response.authResponse.accessToken;
    } else {
        alert( response.status );
    }
});

所以你可能会问自己“那么为什么它开始起作用?”,答案很简单:首先,sdk 具有身份验证数据,并且不需要实际向 fb 服务器发出请求,正如它在文档中所述方法:

往返 Facebook 的服务器

为了提高应用程序的性能,并非每次检查用户状态的调用都会导致对 Facebook 服务器的请求。在可能的情况下,响应会被缓存。在当前浏览器会话中第一次调用 FB.getLoginStatus,或者 JD SDK 以 status: true 初始化,响应对象将被 SDK 缓存。对 FB.getLoginStatus 的后续调用将从此缓存响应返回数据。

如果您尝试传递“true”的代码,如下所示:

var accessToken = "";
FB.getLoginStatus(function (response) {
    if (response.authResponse || response.status === 'connected') {
        accessToken = response.authResponse.accessToken;
    } else {
        alert( response.status );
    }
}, true);
return accessToken;

那么它根本不应该工作。

于 2012-06-05T08:39:22.593 回答
0

在这种情况下调用 FB.login,如果用户仍然登录到 FB 并且您没有请求任何新权限,它只会打开弹出窗口并立即再次将其关闭。

于 2012-06-05T08:35:29.280 回答