2012-05-17 36 views
15

我想知道是否有人找到了我所遇到的行爲的解決方法。如果用戶未登錄到Facebook,則auth.statusChange在FB.init期間不會觸發

就拿例如下面的代碼:

<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> 

使用FB.init與狀態設置爲true,根據facebook documentation基本要求getLoginStatus()。然而,它是apparently intended behaviour,這將而不是觸發事件auth.statusChange,因爲默認值是'未知','未登錄'的值也是'未知'(即使它可以被知道! )

因此我不得不打電話給FB.getLoginStatus()明確以及狀態設置爲true,如果我也想回應未登錄到Facebook的用戶。

問題是,如果用戶是「註銷」以外的任何東西,則會導致函數被調用兩次。

有沒有一種簡潔的方法來阻止這種情況的發生? 我想我唯一的選擇可能是調用不同的函數來處理身份驗證更改事件..

+0

奇怪 - 這個錯誤似乎已被刪除。這整件事是一場災難。我不知道「status:true」何時有用。他們說:'如果您在FB中將狀態設置爲true。init()調用時,SDK將嘗試在init之後立即獲取有關當前用戶的信息。如果您使用的是Facebook登錄,那麼這樣做可以減少檢查登錄用戶的狀態所需的時間,但對於只有社交插件的網頁無效。這是否意味着響應被緩存? –

回答

14

我給這家最好的解決方案是狀態設置爲在fb.init選擇「假」,則明確getloginstatus單獨調用。

如果獲取登錄狀態回到未知狀態(即註銷),我訂閱狀態更改事件,以及通常顯示登錄按鈕。然後,當用戶登錄時,狀態更改按預期啓動。

+0

他們確實設法弄出一些本應該如此簡單的事情 –

0

你可以檢查你回來的響應傳遞在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(); 
    }); 
}; 

如果您將status設置爲trueFB.getLoginStatus響應對象將由SDK進行緩存,並且隨後對FB.getLoginStatus的調用將從此緩存的響應中返回數據。

要解決這個問題,您必須撥打FB.getLoginStatus並將第二個參數設置爲true來強制往返Facebook - 有效地刷新響應對象的緩存。

FB文件:https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

+4

緩存不是我上面描述的問題。 在fb.init中設置status = true應強制進行登錄狀態檢查,然後在檢查發生時觸發狀態更改事件。 –

+0

status = true被緩存,因此您需要getLoginStatus()中的true參數。 – Philip

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僅在加載時被調用一次。

相關問題