2012-03-18 37 views
1

我的站點的外觀在很大程度上取決於用戶是否通過Facebook登錄,因此,對於我來說,發現Facebook會話發生任何更改一旦發生就非常重要我調整頁面的外觀以反映用戶登錄狀態。我討厭使用這種代碼的時間間隔和超時時間,因爲事情會變得非常混亂,但它似乎是唯一的選擇(據我所知)。檢測對Facebook會話的更改

我已經嘗試過使用FB.subscribe(auth.statusChange),但是這似乎並沒有足夠的正常點火時間。也許我用錯了?

我測試過FB.subscribe(auth.statusChange)的方式,就是簡單地記錄每次被觸發,並在另一個選項卡上有意登錄和登出Facebook。看起來大約需要30分鐘的時間才能真正開火(並且它並不總是開火)。這不僅是很難測試,因爲我必須每次等待30分鐘,它似乎不一定正確開火。我使用不正確?

我想使用的代碼是這樣的,但我不喜歡它,因爲它使用超時/間隔:

window.fbAsyncInit=function(){ 
    // Initialize the Facebook object 
    FB.init({ 
     appId:"123", 
     status:true, 
     cookie:true, 
     xfbml:true, 
     oauth:true 
    }); 
    // Check the Facebook session status every 30 seconds 
    setInterval(function(){ 
     FB.getLoginStatus(function(a){ 
      // Change the page look based on the facebook status 
      fb_welcome(a.status) 
     },true)} 
    ,30000); 
}; 

另外,我寧願使用超時,而不是一個區間,但是這需要我通過Facebook的對象到另一個功能是這樣的:

// Check the Facebook session status every 30 seconds 
setTimeout(function(){ 
    // Pass the Facebook object to the welcome function 
    fb_welcome(FB); 
,30000); 

它是一個壞主意,在FB對象傳遞給fbAsyncInit功能之外的其他功能?

回答

2

其實最好是訂閱auth.authResponseChange事件。這是作爲最佳實踐在Event.subscribe文檔中列出的。

對於大多數情況下,您將需要訂閱auth.authResponseChange而不是auth.statusChange。該響應以javascript數組的形式返回,而不是以JSON編碼。

更新:
好像這個,如果你在其他情況下,像登錄/註銷做調用Facebook的API,並可能不會爲你工作爲好,因爲它是從時間打電話的時間。

你要求的東西在Facebook JS-SDK中並不存在,間隔似乎是一種選擇。您可以設置僅調用FB.getLoginStatus的時間間隔,並保留事件訂閱,因爲如果檢測到狀態/ authResponse更改,事件將被觸發。

FB.Event.subscribe('auth.authResponseChange', function(authResponse){ 
    // authResponse changed 
}); 

window.setInterval(FB.getLoginStatus, 30000); 
+0

謝謝您的回覆! :-)這多久會被解僱?即使用戶狀態更改爲'not_authorized'或'unknown',它是否被解僱? – 2012-03-18 13:05:34

+0

也許我使用這個錯誤,但它似乎沒有工作。我已將它放入我的代碼中,然後在另一個選項卡上退出Facebook。絕對沒有事件發生在我的網站上,並且控制檯中沒有記錄任何事件。 – 2012-03-18 13:10:48

+0

是否有任何意見保持活動訂閱,因爲我將每隔30秒測試一次更改?我想我會使用第二種方法,我建議使用setTimeout,我唯一的問題是,我不知道我是否應該將Facebook對象傳遞到另一個函數。這是一個壞主意嗎? – 2012-03-18 13:48:25

1

我有完全相同的問題。

我可是30秒間隔的不是一個大風扇,因爲我不得不 平我的服務器也知道在我的網站我的用戶的狀態 因爲從來就Facebook用戶和普通用戶,也因爲 也許沒有必要根據用戶動作(動作 依靠在Facebook上,其他人沒有)

所以,I'm旨在做getLoginStatus在JavaScript只有當 用戶要求,實際上需要調用一個動作Facebook 在服務器端

我使用FB Javascript SDK與PHP SDK結合使用。

所以我想我會做的FB.login

  • :如果連接然後做服務器端驗證 和我設置超時當令牌過期做getStatusLogin 只刷新令牌
  • 由於auth.statusChange事件似乎只在頁面加載時觸發 我將在此時(頁面加載)根據我的站點中的用戶狀態 實施操作。
  • 當用戶請求需要FB交互的行爲 - > getLoginStatus

我看到的唯一問題是,它會減慢用戶響應。 您覺得我每30秒x用戶的服務器負載情況如何?

UPDATE

  • 由於最是煩人的事情是令牌到期我要實現的是令牌的自動刷新thank's在JavaScript調用getLoginStatus
  • 對於剩下的我會在setTimeout的堅持一個更簡單的解決方案,這是一個很好的服務器錯誤頁面在Facebook異常要求重新連接,如果:
    • 他們已經註銷我的應用程序外的臉書,
    • 他們有未經授權的我的應用程序(所以他們不想使用它)。

在我的情況,這兩個可能性比第一個(令牌過期)更anecdotic。 so KISS

+0

這不是問題的答案。請根據此內容創建一個新問題。 – 2012-09-30 09:42:56

1

適用於更現代瀏覽器的解決方案是利用localStorage事件在瀏覽器選項卡之間傳播狀態更改。

訂閱auth。authResponseChange和更新的localStorage以反映狀態:

FB.Event.subscribe('auth.authResponseChange', function(authResponse){ 
    window.localStorage.setItem('fbstatus',authResponse.status) 
}); 

訂閱localStorage的變化

window.addEventListener('storage', function(storageEvent){ 
    // this event will be fired in other tabs (not the originating tab) 

    var fbStatus = window.localStorage.getItem('fbstatus'); 

    // take action based on the status 

}, false); 

注意storageEvent參數還包含有關可以直接代替被檢查總是檢查的localStorage的fbstatus值的事件數據在任何存儲事件中:

storageEvent.key //check if 'fbstatus' 
storageEvent.storageArea // the storage object 
storageEvent.oldValue 
storageEvent.newValue