2011-11-19 47 views
3

我正在使用Flash Builder 4.5,AIR 2.6,Facebook action script 3 API the latest version制作适用于Android的移动AIR应用程序。Facebook动作脚本3 API登录/注销问题

我遇到登录/注销问题。我只能登录一次 - 然后我的数据缓存以某种方式自动登录。当我呼叫注销时,我收到了响应TRUE,但我并没有真正从系统注销。标准登录对话框不会显示给我。我已经阅读了很多关于stackoverflow和官方网站上公开问题的文章,但没有一篇是有帮助的。我该如何解决这个问题?以下是我使用的代码:

package 
{ 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.display.Stage; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.external.ExternalInterface; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.system.Capabilities; 
    import flash.system.Security; 
    import flash.display.Loader; 
    import com.facebook.graph.FacebookMobile; 

     public class TestProj extends Sprite 
     { 
      public function TestProj() 
      { 
       super(); 

       //register to add to stage 
       this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

       // support autoOrients 
       stage.align = StageAlign.TOP_LEFT; 
       stage.scaleMode = StageScaleMode.NO_SCALE; 
      } 

      private function onAddedToStage(event:Event):void 
      { 
       this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

       FacebookMobile.init("195053007196177", initCallback); 
      } 

      private function initCallback(success:Object, fail:Object):void 
      { 
       var appPermissions:Array = new Array("read_stream", "offline_access", "publish_stream", "read_friendlists"); 
       FacebookMobile.login(loginCallback, this.stage, appPermissions); 
       //FacebookMobile.logout(logoutCallback); 
      } 

      private function loginCallback(success:Object, fail:Object):void 
      {  
//And here I always receive success with my UserID 
//and login dialog don't appears to me before this 
       if (success) 
       { 
        trace("login ok"); 
       } 
       else 
        trace("login failed"); 
      } 

      private function logoutCallback(success:Object):void 
      { 
//here I reseive "TRUE" always!! 
       trace(success); 
      } 

     } 
    } 

回答

6

您只将logoutCallback的第一个参数传递给您的注销方法。如果您为您的应用程序添加了为您的网站url指定的第二个参数,则应该将其清除出该窗口的html cookie。另外,设置FacebookMobile.manageSession = false;

  FacebookMobile.logout(logoutCallback, "http://your_app_origin_url"); 

有一个潜在的相关错误,涉及到桌面和移动设备不以同样的方式访问或清除访问令牌。为此,有一种黑客描述了在FacebookMobile中公开访问令牌,然后用访问令牌手动调用“注销”方法。这里描述的问题包括一个名为“reallyLogout”的方法。 If what I've written above doesn't work, implement "reallyLogout".

当您注销时,您的应用将清除本地会话,但不会将您注销到系统外。这在the documentation for logout.中明确定义如果您在智能手机,网络浏览器和现在的这个移动桌面应用上登录Facebook,并且突然注销,它不应该将您注销到任何地方在那个浏览器会话中。所以传递第二个参数。

+0

感谢名单,但我通过了第二个参数,但它仍然不工作(( – yozhik

+0

FacebookMobile.logout(logoutCallback,“HTTP://米facebook.com“); – yozhik

+0

这不是你的应用程序url我的朋友。这是m.facebook.com。放入你的应用程序的URL。此外,看看实现reallyLogout(),我可以通过你说。 –

0

看看这个问题的解决方案。莫比有人可以帮助:

var stage_ref:Stage = PlatformUtil.originalStage(); //my custom class to get stage 
var webView:StageWebView = new StageWebView(); 
webView.viewPort = new Rectangle(0, 0, stage_ref.width, stage_ref.height); 
FacebookMobile.login(loginCallback, stage_ref, appPermissions, webView); 

http://code.google.com/p/facebook-actionscript-api/issues/detail?id=381

http://code.google.com/p/facebook-actionscript-api/issues/detail?id=382

http://code.google.com/p/facebook-actionscript-api/issues/detail?id=383

1

我有这个确切的问题,并试图修复无数之后,这次终于似乎工作:

默认的注销功能似乎没有通过FacebookMobile actionscrip正确清除cookie t API。在comment #33 here解决方案为我工作,在这里转载。请务必在您自己的APP_ID中下载:

function logout(e:MouseEvent):void { 
    FacebookMobile.logout(onLogout, "https://m.facebook.com/dialog/permissions.request?app_id=APP_ID&display=touch&next=http%3A%2F%2Fwww.facebook.com%2Fconnect%2Flogin_success.html&type=user_agent&perms=publish_stream&fbconnect=1"); 
} 

function onLogout(result:Object):void 
{ 
    trace("Perfect Log Out!") 
} 
1

整天都有这个Android Facebook清理注销问题,设法解决它。希望能帮助到你。这是我的FB手机handlelogin代码,以确保所有fb cookie和会话都被删除,用户需要重新登录。
有时FB服务器很慢。它最好放在一个计时器调用handleLoginClick(前)再次

function handleLoginClick():void 
    { 
     trace("connecting to facebook"); 
     if (FacebookMobile.getSession() == null) 
     { 
      FacebookMobile.init(APP_ID, onHandleInit, null); 
      FacebookMobile.manageSession = false 
     } 
     else 
     { 
      var webView:StageWebView = new StageWebView(); 
      webView.viewPort = new Rectangle(0, 0, 1, 1);   
      webView.stage = this.stage;   
      webView.loadURL("https://m.facebook.com/logout.php?confirm=1&next=http://www.facebook.com&access_token=" + FacebookMobile.getSession().accessToken); 
      webView.addEventListener(Event.COMPLETE,webviewhandleLoad); 
      function webviewhandleLoad(e:Event) 
      { 
       FacebookMobile.logout(null, "http://apps.facebook.com/<appName>/"); 
       FacebookMobile.logout(null, "http://www.facebook.com"); 
       webView.dispose() 
       webView = null 
       setTimeout(handleLoginClick,3000) 

      } 
     } 
    }