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>

使用状态设置为 true 的 FB.init,本质上是getLoginStatus()根据facebook 文档调用。但是,这显然是预期的行为,这不会触发事件auth.statusChange,因为默认值是“未知”,“未登录”的值也是“未知”(即使它可以知道!!)

因此,如果我还想响应未登录 facebook 的用户,我必须FB.getLoginStatus()明确调用并将状态设置为true。

问题是,如果用户不是“注销”,这会导致函数被调用两次。

有没有一种巧妙的方法来阻止这种情况的发生?我认为我唯一的选择可能是调用不同的函数来处理身份验证更改事件。

4

3 回答 3

14

我对此的最佳解决方案是在 fb.init 选项中将状态设置为“假”,然后单独显式调用 getloginstatus。

如果get loginstatus 返回未知(即注销),我订阅了状态更改事件,并按照通常的方式显示登录按钮。然后当用户登录时,状态更改按预期触发。

于 2012-06-18T23:02:44.693 回答
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 仅在加载时调用一次。

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

如果您将 设置statustrue,则FB.getLoginStatus响应对象将被 SDK 缓存,后续调用FB.getLoginStatus将从此缓存的响应中返回数据。

为了解决这个问题,您必须调用FB.getLoginStatus第二个参数集以true强制往返 Facebook - 有效地刷新响应对象的缓存。

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

于 2012-05-18T05:40:55.450 回答