16

私が経験している動作の回避策を誰かが見つけたのではないかと思いました。

以下のコードの例を見てください。

<script>
window.fbAsyncInit = function() {
        FB.init({
          appId      : '[----removed-------]', // App ID
          channelUrl : 'http://localhost/channel.html', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies
          xfbml      : true  // parse XFBML
        });     
        // Additional initialization code here

        FB.Event.subscribe('auth.statusChange',fbLoginStatus);

        console.log("getloginstatus");

        FB.getLoginStatus(fbLoginStatus);
</script>

status を true に設定して FB.init を使用すると、基本的にFacebook のドキュメントgetLoginStatus()に従って呼び出します。ただし、デフォルト値が「不明」であり、「ログインしていない」の値も「不明」であるため、これがイベントをトリガーしないことは明らかに意図された動作です(たとえそれが知られている可能性があっても!!)auth.statusChange

したがって、Facebook にログインしていないユーザーにも応答したい場合は、FB.getLoginStatus()明示的呼び出し、ステータスを true に設定する必要がありました。

問題は、ユーザーが「ログアウト」以外の場合、関数が 2 回呼び出されることです。

これを止めるきちんとした方法はありますか?私の唯一のオプションは、認証変更イベントを処理するために別の関数を呼び出すことだと思います..

4

3 に答える 3

4

理論的に往復を節約するより良い解決策は次のとおりです(coffeescriptですが、javascriptに簡単に変換できます):

FB.init
  appId: appId
  channelUrl: channelUrl
  status: true     # Check Facebook Login status on init
  cookies: true
  xfbml: false

FB.getLoginStatus (response) =>
  @parseResponse(response)
  FB.Event.subscribe 'auth.statusChange', @parseResponse
  FB.Event.subscribe 'auth.authResponseChange', @parseResponse

ユーザーが不明な場合に起動する手動の getLoginStatus を引き続き使用していますが、今回も「status: true」を使用して、getLoginStatus が呼び出されたときにログイン ステータスが既にキャッシュされているようにします。getLoginStatus が発生した後にのみ関連するイベントをサブスクライブすることで、処理メソッド parseResponse がロード時に 1 回だけ呼び出されるようにします。

于 2013-06-24T22:15:32.403 に答える
0

で true パラメーターを渡した後に返される応答を確認できますgetLoginStatus

window.fbAsyncInit = function() {
    FB.init({
        appId  : '',
        status : true,
        cookie : true,
        xfbml  : true,
    });

    FB.getLoginStatus( function(response) {
        //console.log(response);
        if (response.status === 'connected') {
            var accessToken = response.authResponse.accessToken;
            alert(accessToken);
        } else if (response.status === 'not_authorized') {
            //login function
        } else {
            //login function
        }
    }, true);

    FB.Event.subscribe('auth.authResponseChange', function(response) {
        //console.log('The status of the session changed to: '+response.status);
        window.location.reload();
    });
};

を に設定するstatustrueFB.getLoginStatus応答オブジェクトは SDK によってキャッシュされ、その後の の呼び出しはFB.getLoginStatus、このキャッシュされた応答からデータを返します。

これを回避するにはFB.getLoginStatus、2 番目のパラメーターを に設定して呼び出し、 trueFacebook へのラウンドトリップを強制する必要があります。これにより、応答オブジェクトのキャッシュが効果的に更新されます。

FB ドキュメント: https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

于 2012-05-18T05:40:55.450 に答える