FB.getLoginStatus没有调用它的回调函数

23

标题已经说明了一切。在某些(未确定)条件下,FB.getLoginStatus()就会停止工作,并且不会调用我提供的回调函数。我发现的唯一有趣的线索是:

  • FB.Auth._loadState被卡在“loading”状态--无论是什么应该使它转换为“loaded”的东西都没有发生
  • 稍微延迟一点,比如加入alert()调用,往往可以让它开始工作

关于如何调查这个问题的任何提示都欢迎。


1
它会在用户卸载您的应用程序后可靠地发生。 - Martin
我也遇到了这个问题。你是否收到Facebook登录弹出窗口和Facebook错误消息,或者根本没有弹出窗口?对我来说,弹出窗口已经停止工作了(并且它没有被阻止 - 只是没有被调用,在JavaScript中也没有回调)。 - potench
11个回答

30
通常情况下,这种情况发生在我将页面运行在与Facebook注册时不同的域名下。通常情况下,这是在我本地开发时发生的。
如果您正在本地运行,请设置本地Web服务器,然后修改hosts文件,将已注册的域名指向127.0.0.1以便在本地机器上进行测试。不要忘记在想要在服务器上测试时从hosts文件中删除该行。

4
是的是的是的!终于。我很久以前创建了一个Facebook应用,但从来没有时间更改URL。FB竟然没有提供有用的错误信息,真可惜。 - JnBrymn

12

根据:

https://developers.facebook.com/bugs/240058389381072

如果您将应用程序置于沙箱模式下,则无法正常工作。进入您的应用程序设置,选择高级选项,并切换它。我在看到这个错误报告之前困扰了几个小时。


12

我曾经遇到了与FB API类似的问题。后来发现,我的Facebook应用程序设置不正确。请确保你的情况不是这种情况。我的问题在于FB应用程序中我的“Site URL”参数指向了https,但我在开发过程中使用的是http协议。在FB.init之后对FB api进行的任何调用都没有调用我的回调函数。所以首先要做的就是仔细检查应用程序配置。

现在,如果你由于某些原因依赖于FB api,但希望在它失效时有一个备选方案 - 可以通过定时器的方法进行解决。只需设置一个计时器,并在FB Api给出适当响应时将其禁用。如果没有 - 就退回到一些自定义函数,该函数将执行额外的逻辑。

 function callFbApi() {
    var timeoutHandler = setTimeout(function() { requestFailed(); }, 1000);

    function requestFailed() {
        // When this happens, it means that FB API was unresponsive
        doSomeFallbackWork();
        alert('hey, FB API does not work!');
    }

    FB.getLoginStatus(function(response) {
        clearTimeout(timeoutHandler); // This will clear the timeout in case of proper FB call
        doSomeUsualWorkAfterFbReplies();

        return false;
    }, true);
 }

6
如果你的应用程序处于沙箱模式下,Facebook 会将你的应用程序视为对未列为应用程序开发者的任何人都不可见。如果您没有登录,则您的应用程序现在是不可见的。
只有在使用可见应用程序初始化时,回调才会触发。否则,返回以下响应:
<span>Application Error: There was a problem getting data for the application you requested. The application may not be valid, or there may be a temporary glitch. Please try again later. </span>

更多信息请查看我在此错误票证上的评论: https://developers.facebook.com/bugs/240058389381072


6

也许你正在使用异步调用。当我使用window.fbAsyncInit调用FB.init时,出现了同样的情况。我所做的就是使用setTimeout函数延迟FB.getLoginStatus的调用。

  window.setTimeout(checkLogStatus, 1000);


  function checkLogStatus(){
          alert("check");
          // fetch the status on load      
          FB.getLoginStatus(handleSessionResponse);
  }

之后似乎就可以正常工作了。


1
在新版本的开发者应用程序中,您必须确保在“网站”字段下输入您使用的访问应用程序的正确URL。
在“选择应用程序如何与Facebook集成”部分下。

1

我遇到了类似的问题。打开浏览器时网站可以正常运行,但尝试重新加载时却失败。

原因是Facebook配置中网站名称缺少“www”。请注意,在网站名称前加上“www”(例如www.yoursite.com)可适用于两种情况(yoursite.com或www.yoursite.com)。


1
请确保协议是HTTPS而不是HTTP。

0

正如其他人所发表的,您必须在与 Facebook 期望的相同 URL 上访问您的网站。例如,如果 Facebook 有一个回调 "example.com",但您的浏览器有 "www.example.com",那么可能会导致此问题。

此外,如果您的浏览器不允许第三方 cookie,则也可能会出现此问题。或者您可能会看到回调 错误地报告用户未连接


0

我想分享一个遇到的情况,就是调用FB.getLoginStatus没有任何响应。

我的应用程序是设计在选项卡中运行的,我只在应用程序管理页面上输入了页面选项卡URL,而没有输入Facebook应用程序(即画布)URL。选项卡可以完美加载,但对FB JS SDK的任何调用都没有响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接