我在网上看到的所有解决方案都不适合我。问题确实是 StageWebView facebook cookie 在使用 FacebookMobile.logout() 调用注销时没有被清除。使用访问令牌加载 logout.php 可能对我没有帮助,因为空中应用程序没有有意义的“下一个”参数值。我看到有人建议在那里使用 localhost 或 facebook.com,但这些选项都不起作用。
我提出了一个非常有问题的解决方案,但它现在有效。
关键是通常在 facebook 中注销用户,就像他自己注销一样。为此,我们需要在 StageWebView 中加载 facebook.com 并单击注销。注销按钮是“logout_form” html 表单的提交表单项。所以我们需要进行一个javascript调用
document.getElementById('logout_form').submit();
在我们的 StageWebView 中。我们可以通过调用
来做到这一点
webView.loadURL("javascript:document.getElementById('logout_form').submit();");
在 ActionScript 中。
我现在使用的完整代码
protected var _logoutAttemptInProgress:Boolean = false;
public function fbLogout():void{
if(!_isLoggedIn) return;
if(_logoutAttemptInProgress) return;
_logoutAttemptInProgress = true;
var webView:StageWebView = new StageWebView();
webView.viewPort = new Rectangle(-1, 0, 1, 1);
webView.stage = this.stage;
webView.loadURL("http://www.facebook.com/lksmlrsgnlskn");
webView.addEventListener(Event.COMPLETE, runLogoutJs);
function runLogoutJs(event:Event):void{
webView.removeEventListener(Event.COMPLETE, runLogoutJs);
var jsString:String = "document.getElementById('logout_form').submit();";
webView.loadURL("javascript:"+jsString);
webView.addEventListener(Event.COMPLETE, closeWebView);
}
function closeWebView(event:Event):void{
webView.removeEventListener(Event.COMPLETE, closeWebView);
webView.stage = null;
webView.dispose();
_isLoggedIn = false;
_logoutAttemptInProgress = false;
}
FacebookDesktop.logout(null, APP_ORIGIN);
}
“lksmlrsgnlskn”只是一些随机垃圾,用于访问比主页面小得多且加载速度更快的错误页面。
FacebookDesktop.logout 用于清除 Facebook lib 可能仍拥有的任何本地 SharedObject 数据。