2011-09-23 92 views
8

我有一個難題。困難的手段,我通過網絡和StackOverflow搜索以及整個FBJS SDK文檔,並沒有找到答案。FB.getLoginStatus不會觸發回調函數

我正在構建一個頁面選項卡應用程序,我想讓粉絲來rsvp事件。所以我必須檢查用戶是否登錄,如果沒有,我必須登錄。這聽起來很簡單,但FB.getLoginStatus不會觸發回調函數。這是代碼摘錄:

FB.init({ 
    appId: window.appID, 
    status: true, 
    xfbml: true, 
    cookie: true, 
    oauth: true, 
    channelUrl: 'http://example.com/fb/channel.html' 
}); 

,然後我簡單 - 在用戶點擊按鈕後,當然 - 撥打FB.getLoginStatus,但似乎並沒有做任何事情。

我已經檢查過沙箱模式,FB.init成功,應用程序設置和開發環境中的URL。我可以調用FB.ui,儘管FB.ui使用方法:'oauth'我收到一條錯誤消息,說「」redirect_uri「參數不能與」next「參數結合使用,而此參數已被棄用。」這很奇怪,因爲我沒有使用「下一個」參數。但是當我在undefined旁邊設置時,它工作正常,我得到了窗口,但它顯示「給定URL不被應用程序配置允許」。期望從那以後,我可以登錄,然後我有access_token。但在新窗口中,getLoginStatus仍然不起任何作用。

因此,歡迎任何意見。

感謝, 塔馬斯

UPDATE

function onBodyLoad() { //on body onload 
    FB.init({ 
    appId: window.appID, 
    status: true, 
    xfbml: true, 
    cookie: true, 
    oauth: true, 
    channelUrl: 'http://example.com/fb/channel.html' 
    });  
    } 
... 
function getName() { // on button onclick 
FB.getLoginStatus(function(response){ 
    if (response.authResponse) 
    { 
    window.loggedIn = true; 
    debugString('Logged in'); 
    } else 
    { 
    window.loggedIn=false; 
    debugString('Not logged in'); 
    } 
}, true); 
if (window.loggedIn === undefined) { 
    debugString('getLoginStatus did not exec'); // I always get this message 
    } 

}

更新2:我創建了一個新的應用程序在不同的URL,它被配置爲一個獨立的網站。這些代碼完美工作,我可以得到LoginStatus,我可以登錄等等。在FB的上下文中以及在獨立網站中使用FB JavaScript SDK有什麼區別?

+0

你會提供更多的代碼嗎? – ifaour

回答

16

FB.getLoginStatus當你在比你註冊的應用程序會與一個不同的域中運行的網站不火的回調。當我在本地開發或在臨時服務器上進行開發時,我通常會遇到這種情況。

例如,如果您註冊了網站與example.com和您的臨時服務器是example.mystagingserver.com,回調不會火。在這種情況下,您需要在Facebook中創建第二個應用程序,併爲新應用程序使用應用程序ID和祕密。

+0

我不知道發生了什麼,但昨天我再次檢查了應用程序設置,並將App域顯示爲可刪除的標籤,而不是我以前看到的字符串,並且 - voilá - 所有內容都以平滑運行的機器運行。 –

0

您可以使用下面的代碼來檢查,如果用戶登錄:

FB.getLoginStatus(function(response) { 
    if (response.authResponse) { 
     // logged in and connected user, someone you know 
    } else { 
     // no user session available, someone you dont know 
    } 
}); 

FB JS SDK Documentation

可以在jQuery準備整個包住代碼:

$('document').ready(function(){ 
    ... above code 
}) 

你也可能要檢查this question StackOverflow

+1

這是壞的部分,因爲回調函數不會在getLoginStatus上運行......正如我在原始問題中所說的那樣。我讀到你提到的問題,但沒有幫助。 –

+0

我遇到了同樣的問題,只有在用戶登錄後纔會調用FB.getLoginStatus。 – thesmart

+0

我已登錄,沒有這樣的運氣:O –

2

我正在使用此代碼,成功。我不太清楚差異在哪裏..但是我使用的是ASYNC FB Loader。

window.fbAsyncInit = function() { 
    FB.init({ appId: 'XXXXXX', //change the appId to your appId 
      status: true, 
      cookie: true, 
      xfbml: true, 
      oauth: true}); 

function authEvent(response) { 

    if (response.authResponse) { 
      //user is already logged in and connected 
      FB.api('/me', function(info) { 
       login(response, info); 
      }); 
    } else { 
      //user is not connected to your app or logged out 
      button.onclick = function() { 
      FB.login(function(response) { 
      if (response.authResponse) { 
       FB.api('/me', function(info) { 
        login(response, info); 
       }); 
       } else { 
       //user cancelled login or did not grant authorization 
      } 
     }, {scope:'email,rsvp_event,status_update,publish_stream,user_about_me'});  
        } 
       } 
      } 

      // run once with current status and whenever the status changes 
      FB.getLoginStatus(updateButton); 
      FB.Event.subscribe('auth.statusChange', updateButton); 
     }; 
     (function() { 
      var e = document.createElement('script'); e.async = true; 
      e.src = document.location.protocol 
       + '//connect.facebook.net/en_US/all.js'; 
      document.getElementById('fb-root').appendChild(e); 
     }()); 


     function login(response, info){ 
      if (response.authResponse) { 
       accessToken = response.authResponse.accessToken; 
     userid = info.id; 


       userInfo.innerHTML = '<img src="https://graph.facebook.com/' + info.id + '/picture">' + info.name+"<br /> Your Access Token: " + accessToken; 
      } 
     } 
+0

試過了,但沒有幫助...謝謝,反正 –

3

我剛剛有同樣的問題,但它只發生在一些用戶。

我終於發現,如果您的應用程序是沙盒模式,那麼非開發人員用戶仍然可以將您的應用程序視爲頁面選項卡。但是調用getLoginStatus會靜默失敗(即使打開日誌記錄)。

花了一段時間想出來,希望這可以節省別人一些時間。

0

對我來說,廣泛的測試後,可以確認對話框登錄的用戶將不會顯示,除非你使用一個有效的Application ID

這些可以在

https://developers.facebook.com/apps/{{Application__Id}}/settings/ 

發現只要確保你調用與API正確的ID。