Facebook的AS3 - 为什么我的登录回调没有被调用?

问题描述:

我们正在开发一个与Facebook大量集成的Flash网站。Facebook的AS3 - 为什么我的登录回调没有被调用?

我们已经注意到一个错误,如果用户没有登录到Facebook,并且我们尝试通过Facebook提供的AS3类中的Facebook.login登录它们,则调用回调,但参数结果为:对象和失败:对象都是空的。如果我们的用户然后再次尝试登录,则一切正常,返回结果中的用户ID:如果成功则返回对象。

这是Facebook本身的错误吗?有没有人见过这个?我们确信这一周前没有发生。

Facebook.login(onLogin, {perms:Config.FB_PERMISSIONS}); 

private function onLogin(result:Object, fail:Object):void { 

    // first time this is called after the popup closes returns 
    // result == null and fail == null 
    // second time around, results are as expected 
} 

干杯, 马克。

这是有点脏,但我之前调用超时登录工作得很好:

的setTimeout(Facebook.login,200,onLogin,{烫发:Config.FB_PERMISSIONS});

+0

是的这就是我们最终做的 - 或者类似的。我实际上不得不打电话给Facebook.login两次才能使它起作用 - 我想象超时也会起作用。 – koosa 2011-07-22 20:25:14

+0

谢谢你。 – Mattias 2012-02-24 11:04:21

这是一种使用Graph API连接到Facebook的方式。一切都在评论中解释。这实际上是连接到Facebook,不会张贴到墙壁或任何东西。该部分可以在本课下面找到。

package com.DAL 
{ 
    import com.facebook.graph.Facebook; 
    import flash.events.Event; 
    import com.facebook.graph.data.FacebookSession; 
    import flash.events.EventDispatcher; 
    import flash.events.MouseEvent; 
    import com.fbLoginButton; 
    import com.adobe.serialization.json.JSON; 

    public class FBConnect extends EventDispatcher 
    { 
     /****************************************** 
     * Variables 
     ******************************************/ 
     private var _applicationID:String; 
     private var _extendedPermissions:Object; 

     /****************************************** 
     * Constants 
     ******************************************/ 
     public static const CONNECTED:String = "CONNECTED"; 

     /****************************************** 
     * Properties 
     ******************************************/    
     public function get applicationID():String 
     { 
      return _applicationID; 
     } 

     /****************************************** 
     * Constructor 
     ******************************************/ 
     public function FBConnect() 
     { 
      super(); 

      //Set applicationid 
      _applicationID = "YOUR_ID"; 

      //Set permissions to ask for 
      _extendedPermissions = {perms:"read_stream, publish_stream, user_about_me, read_friendlists, user_photos"}; 

      //Initialize facebook 
      Facebook.init(_applicationID); 
     } 

     /****************************************** 
     * Methods 
     ******************************************/  
     public function login(e:MouseEvent):void 
     {   
      Facebook.login(handleLogin, _extendedPermissions); 
     } 

     private function handleLogin(response:Object, fail:Object):void 
     { 
      dispatchEvent(new Event(CONNECTED)); 
     } 
    } 
} 

这应该照顾连接到Facebook。如果你想发布到墙壁或任何东西,你可以在下面找到一个小例子。

 /****************************************** 
     * Constructor 
     ******************************************/ 
     public function FBLogic() 
     { 
      super(); 

      _connect = new FBConnect(); 
      _connect.addEventListener(FBConnect.CONNECTED, startLoaders); 

      initLoaders(); 
     } 

     /****************************************** 
     * Methods 
     ******************************************/ 

     ... 

     public function post(message:String):void 
     { 
      var _params:Object = new Object(); 

      _params.access_token = Facebook.getSession().accessToken; 
      _params.message = message; 

      Facebook.api("/" + _userID + "/feed", messagePosted, _params, "POST"); 
     } 

     public function messagePosted(response:Object, fail:Object):void 
     { 
      dispatchEvent(new Event(MESSAGEPOSTED)); 
     } 

     public function login(e:MouseEvent):void 
     { 
      var _loginButton:fbLoginButton = e.target as fbLoginButton; 
      _loginButton.alpha = 0; 
      _loginButton.visible = false; 

      _connect.login(e); 
     } 

如果这没有办法,你可能已经忘记添加一些代码到你的html文件。一定要将下面的代码添加到您的html文件的头部:

<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script> 

而且您还需要一个名为fb-root的div,声明如下。

<body> 
    <div id="fb-root"></div> 
    <div id="flashContent"> 
    </div> 
</body> 
+0

太好了。这对我有用,解决方案很好地放在一个单独的类。感谢分享! – 2011-07-24 16:45:30

+0

很高兴我可以帮助:) – 2011-07-24 19:02:30

简短的回答

只要保持Facebook.init()每0.5秒循环,直到它找到一个有效的凭证的cookie。

LONG ANSWER

该文档描述Facebook.init(),为设置功能。但它不止于此,它寻找有效的fb登录cookie。和Facebook.login()一样。

这个想法是在启动时调用Facebook.init(),并查看用户是否已经有权访问。否则使用Facebook.login()来使用户登录。

不是可执行代码:

/** 
    * Start the app, and see if there are any valid credentials 
    **/ 
    public function startApp() { 
     Facebook.init(fbAppid, handleFbLogin); 
    } 

    /** 
    * This is a method to call the app didnt login successfully 
    * at startup. 
    **/ 
    private function tryLogin() { 
     Facebook.login(handleFbLogin, {});  
    } 

    private var lastLoginSuccess:Object; //being a bit pedantic maybe 

    /** 
    * This is the callback that is <i>supposed</i> to run 
    * ones the user has logged in. 
    * Unfortunately the callback assoc. with the login/init 
    * goes off almost instantly; and so often fails before 
    * valid credentials have been creations >:(
    **/ 
    public function handleFbLogin(success:Object, fail:Object) { 
     lastLoginSuccess = success; 
     if(success){    
        //yay! 
     } else { 
        //taps foot impatiently... 
       flash.utils.setTimeout(tryFbInitIfLastFailed, 500); 
     } 
    } 

    /** 
    * And also the user could be taking their sweet time 
    * typing in their password. 
    * Oh and giving their device informative names like 'qwe' 
    * 
    * So when they finally login, and the regularly executing 
    * handleFbLogin() will finally find some valid credentials 
    **/ 
    private function tryFbInitIfLastFailed() {    
     if (lastLoginSuccess == null)  
      Facebook.init(view.fbApp.id, handleFbLogin);  
    } 

任何为什么不保持通话Facebook.login()?因为打开Facebook登录弹出窗口 - 所以你会有稳定的弹出窗口。

这个工作对我来说,无论是如果或者没有登录IM即时通讯已经:

 private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      Facebook.init("APPID", onInit); 
     } 

     private function onInit(response:Object, fail:Object):void 
     { 
      if(response) 
      { 
       handleLoginResponse(true, null);      
      } 
      else 
      { 
       Facebook.login(handleLoginResponse, { scope: "email, user_photos, publish_stream" }); 
      } 
     } 

     private function handleLoginResponse(result:Object, fail:Object):void 
     { 
       if (result != null) { 
        // Logged in 
       } else { 
        // Goodbye :(
       }    
     } 

_extendedPermissions = {烫发: “read_stream,publish_stream,user_about_me,read_friendlists,user_photos”}; 块引用

“烫发” 现在是 “范围”

{范围: “read_stream,publish_stream,user_about_me,read_friendlists,user_photos”};

这在Adobe Facebook API页面上没有很好的记录。

在html文件中使用的标记中添加https for all.js

+1

接受的答案是什么? – 2012-10-05 20:54:03