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

时间:2011-05-03 00:52:52

标签: actionscript-3 facebook facebook-graph-api

我们正在开发一个与Facebook大量集成的Flash网站。

我们注意到一个错误,如果用户没有登录Facebook,我们尝试通过Adobe提供的AS3类中的Facebook.login登录,则会调用回调,但参数结果为:Object和失败:对象是空的。如果我们的用户然后尝试再次登录,那么一切正常,返回结果中的用户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
}

干杯, 标记

6 个答案:

答案 0 :(得分:4)

这是一种使用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>

答案 1 :(得分:2)

这有点脏,但对我来说,在调用登录之前暂停工作正常:

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

答案 2 :(得分:2)

  

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

“烫发”现在是“范围”

  

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

Adob​​e Facebook API页面上没有详细记录。

答案 3 :(得分:0)

简短回答

只需保持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登录弹出窗口 - 所以你将有稳定的弹出窗口流。

答案 4 :(得分:0)

这对我有用,要么我还没有登录,要么我已经:

        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 :(
                }            
        }

答案 5 :(得分:0)

为你在html文件中使用的标签中的all.js添加https