2

我想知道为什么似乎没有执行“else if”案例response.status === 'not authorized' 和“else”案例(“未知”,即用户未登录到facebook)。当我登录到我的应用程序时,会在response.stats === 'connected'. 但是,当我在 Chrome 中打开隐身模式时,不会调用其他其他情况下的 testAPI() 函数。有谁知道为什么?

window.fbAsyncInit = function() {

FB.init({
    appId      : 'appnumberhere', // App ID
    channelUrl : '//localhost/appname/channel.php', // Channel File
    status     : true, // check login status
    cookie     : true, // enable cookies to allow the server to access the session
    xfbml      : true  // parse XFBML
});

FB.Event.subscribe('auth.authResponseChange', function(response) {

    if (response.status === 'connected') {
          testAPI(); // works
    } else if (response.status === 'not_authorized') {
           testAPI(); // not called. Nothing in console.
          FB.login();
    } else {
           testAPI(); // not called. Nothing in console.
          FB.login();
           }
    });


}); // end async init function

testAPI 函数:

 function testAPI() {
    console.log('Welcome!  Fetching your information.... ');
    FB.api('/me', function(response) {
      console.log('Good to see you, ' + response.name + '.');
    });
  }

作为旁注,如果我没有登录,我也不会看到弹出 facebook 登录对话框,这是我认为 fb.login() 应该调用的。

额外的旁注

另外,奇怪的是,我需要<script src="//connect.facebook.net/en_US/all.js"></script>将 FB SDK 包含<script>(function(d){ var js,....</script>在我的频道文件中以使我的应用程序正常工作。否则,某些部件无法加载。不确定这是否相关,但这很奇怪。

4

1 回答 1

1

正如这个问题所解释的,auth.authResponseChangeauth.statuschange用户未登录时不要触发。当用户加载页面时,用户以“未知”状态开始;但是一旦使用 FB.init 调用status:true,Facebook 会检查登录状态并确定用户未登录 - 这也称为“未知”状态!从技术上讲,状态没有变化,因此不会调用状态变化回调。(这似乎是一个主要的 API 设计缺陷,尤其是因为他们自己的示例代码不起作用。)

一种解决方案是该问题的公认答案,是将状态检查设置FB.init为 false,而是使用手动检查状态,FB.getLoginStatus()以便我们自己做出响应。如果用户未登录,则订阅登录事件。如果用户已经登录,那就太好了。

这是我正在使用的代码。 login()并且logout()是我定义的为登录状态和未登录状态呈现页面部分的函数。 logout()显示登录按钮,同时login()显示用户特定信息。

FB.init({
    appId: '...',
    channelUrl: window.location.protocol + '//' + window.location.host + '/channel.html',
    status: false,
    [... other settings ...]
});

FB.getLoginStatus(function(response) {
    if (response.status === 'connected') {
        login();
    } else {
        FB.Event.subscribe('auth.login', function(response) {
            window.location.reload();
            login();
        });
        logout();
    }
});

请注意,window.location.reload();在用户最初没有登录然后自己登录的情况下。这是为了避免与Blocked a frame...您遇到的类似错误,在我的情况下是http://vshttps://不匹配。看看你的情况是否需要它。如果您仍然遇到Blocked a frame...错误,可能是因为您在 Facebook 中配置应用设置的方式。尝试将http://localhost:8080/站点 URL 放在“使用 Facebook 登录的网站”下,然后访问该站点以查看您的应用程序。

于 2013-07-09T03:35:15.023 回答