2012-05-17 5 views
15

angemeldet ist, fragte ich mich, ob jemand eine Abhilfe für das Verhalten, das ich erlebe gefunden hat.auth.statusChange nicht während FB.init ausgelöst, wenn der Benutzer nicht auf Facebook

Nehmen wir das Beispiel des folgenden Code:

<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 mit Status auf true gesetzt verwenden, ruft im Wesentlichen getLoginStatus() der facebook documentation nach. Es ist jedoch apparently intended behaviour, dass dies nicht löst das Ereignis auth.statusChange, weil der Standardwert ist "unbekannt", und der Wert für "nicht angemeldet" ist auch "unbekannt" (obwohl es bekannt sein kann !!)

Deshalb habe ich hatte einen Aufruf an FB.getLoginStatus() ausdrücklich sowie mit dem Status auf true gesetzt zu machen, wenn ich möchte auch für die Nutzer reagieren, die auf Facebook nicht angemeldet.

Das Problem ist, diese Ergebnisse in der Funktion aufgerufen zweimal zu werden, wenn der Benutzer etwas anderes ist als „abgemeldet“.

Gibt es eine nette Art und Weise dies zu verhindern? Ich denke, dass meine einzige Option könnte eine andere Funktion aufzurufen sein Auth Änderungsereignisse zu handhaben ..

+0

seltsam - scheinen diese Fehler beseitigt wurden. Das Ganze ist eine Katastrophe. Ich habe keine Ahnung, wann "status: true" wirklich nützlich ist. Sie sagen: 'Wenn Sie in der FB den Status auf' True 'setzen.init() aufrufen, versucht das SDK unmittelbar nach init Informationen über den aktuellen Benutzer zu erhalten. Dies kann die Zeit verringern, die benötigt wird, um den Status eines angemeldeten Benutzers zu prüfen, wenn Sie Facebook Login verwenden, ist aber nicht für Seiten nützlich, auf denen nur soziale Plugins installiert sind. ' Also bedeutet das, dass die Antwort zwischengespeichert wird? –

Antwort

14

Meine beste Lösung hierfür war Status auf 'false' in den fb.init Optionen einzustellen, dann explizit getloginstatus separat zu nennen.

Wenn get loginstatus kam zurück als unbekannt (d. H. Abgemeldet), abonniert ich das Statusänderungsereignis, sowie die üblichen der Anzeige der Login-Schaltfläche. Wenn sich der Benutzer dann anmeldet, wird die Statusänderung wie erwartet ausgelöst.

+0

schafften sie es wirklich, etwas auszumachen, das so einfach sein sollte –

0

Sie die Antwort, die Sie zurückbekommen überprüfen können, nachdem Sie einen wahren Parameter in der getLoginStatus passieren:

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(); 
    }); 
}; 

Wenn Sie setzen die status zu true, die FB.getLoginStatus Response-Objekt wird durch das SDK und nachfolgende Aufrufe von FB.getLoginStatus zwischengespeichert werden, werden die Daten aus dieser zwischengespeicherte Antwort zurück.

Um dies zu umgehen, müssen Sie FB.getLoginStatus anrufen mit dem zweiten Parameter auf true festgelegt, um eine Rundreise zu Facebook zu erzwingen - effektiv den Cache des Antwortobjekts zu aktualisieren.

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

+4

Caching war nicht das Problem, das ich oben beschrieben habe. Das Setzen von status = true in fb.init sollte eine Überprüfung des Anmeldestatus erzwingen, dann sollte das Ereignis für den Statuswechsel ausgelöst werden, wenn diese Überprüfung stattfindet. –

+0

status = true wird zwischengespeichert. Aus diesem Grund benötigen Sie den true-Parameter in getLoginStatus(). – Philip

4

Eine bessere Lösung, die theoretisch sollten Ihnen ein Rundreisen sparen ist wie folgt (Coffeescript, aber leicht übersetzbar zu 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 

Wir sind immer noch ein manuell getLoginStatus mit ausgelöst, wenn der Benutzer nicht bekannt ist, aber dieses Mal verwenden wir immer noch "status: true", so dass der Login-Status bereits zwischengespeichert wird, wenn getLoginStatus aufgerufen wird. Wenn wir die relevanten Ereignisse erst abonnieren, nachdem getLoginStatus ausgelöst wurde, stellen wir sicher, dass die Behandlungsmethode parseResponse nur einmal beim Laden aufgerufen wird.

Verwandte Themen