0

我正在使用 as3-fb-api 连接到 js-api 的 flash 应用程序。它工作正常:登录,获取朋友的个人资料照片,注销,重复。

但是,如果用户打开指向 facebook.com 的第二个浏览器选项卡,并使用它注销 facebook,然后返回到我的应用程序,并点击调用 Facebook.logout() 的注销按钮,问题就开始了。

我的应用程序监听:

Facebook.addJSEventListener( 'auth.statusChange'       , om__statusChange       ) ;
Facebook.addJSEventListener( 'auth.authResponseChange' , om__authResponseChange ) ;
Facebook.addJSEventListener( 'auth.login'              , om__login_noticed      ) ;
Facebook.addJSEventListener( 'auth.logout'             , om__logout_noticed     ) ;

理想情况下,我希望 Facebook.logout() 会调用 js,这将 ajax fb 服务器,以发现用户已经退出,并返回消息供应用程序处理。

在我的萤火虫调试器中,我看到调用了 facebookjsbridge: logout 函数,但没有调用它的回调 FBAS.handleUserLogout,也没有调用任何事件监听器。

那么将我的应用程序与服务器同步的适当方法是什么?

4

1 回答 1

0

经过几天尝试各种技术,这就是我想出的,但它是HACKish

问题是:如果用户通过 as3-fb-api:Facebook.login(...) 登录到我的 Facebook 应用程序,然后转到另一个浏览器选项卡,在那里打开 facebook.com,在那里注销,然后返回我的应用程序和它搞砸了,我的应用程序变得与 facebook 不同步。

所以为了解决这个问题,我现在有任何和所有 Facebook.api 调用来寻找这个失败:

{ error , [object Object] , object
    { code , 190 , number
      message , Error validating access token: The session is invalid because the user logged out. , string
      type , OAuthException , string
      error_subcode , 467 , number          
     }
}
// I may discover later that there are other types of failures 
//    that I will need to catch as well.

如果任何调用返回此错误,则应用程序会自行重新加载(我使用对 js 的外部接口调用来处理重新加载)。

此外,我在我的 LOGOUT 按钮中添加了一个例程来使用这个系统。最初,当用户按下 LOGOUT 按钮时,我会简单地调用 Facebook.logout(...),但如果用户已经注销则失败...... Facebook.logout(...) 甚至不会调用回调带有错误消息,因此应用程序无法发现不同步问题。

所以现在当用户按下 LOGOUT 按钮时,应用程序首先调用 Facebook.api("/me/" , ... )。为什么?因为即使用户已通过另一个浏览器选项卡注销,该 api 调用也会返回错误消息(或成功消息)。如果此 api 调用返回失败消息/对象,则我将应用程序转移到重新加载阶段,否则我通常继续使用 Facebook.logout(...)

于 2012-05-28T14:33:47.370 回答