2012-03-18 36 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