2

response.status === 'not authorized' 「else if」の場合と「else」の場合 (「不明」、つまり、ユーザーが facebook にログインしていない) が実行されていないように見えるのはなぜでしょうか。アプリにログインすると、それに応じて testAPI() が呼び出され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 設計上の欠陥のようです。)

その質問に対する受け入れられた答えである 1 つの解決策は、ステータス チェックイン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://vsのhttps://不一致を回避するためです。あなたのケースでそれが必要かどうかを確認してください。それでもBlocked a frame...エラーが発生する場合は、Facebook でアプリの設定を構成した方法が原因である可能性があります。http://localhost:8080/「Website with Facebook Login」の下にサイトの URL を入力して、そのサイトにアクセスしてアプリを表示してみてください。

于 2013-07-09T03:35:15.023 に答える