FB.getLogin状态不起作用,如果用户处于非活动状态

FB.getLoginStatus not working if user is inactive

本文关键字:用户 于非 活动状态 如果 getLogin 状态 不起作用 FB      更新时间:2023-09-26

在我的画布应用(标签页)中,如果应用需要,我使用此代码获取访问令牌:

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

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

我应该怎么做才能随时获得访问令牌?

这是

怎么回事:

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是 初始化状态:true,响应对象将由 软件开发工具包。对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;

那么它根本不应该起作用。

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