AS3 для Facebook - почему мой обратный вызов при входе не вызывается? - PullRequest
2 голосов
/ 03 мая 2011

Мы разрабатываем Flash-сайт, который тесно интегрируется с Facebook.

Мы заметили ошибку, когда, если пользователь не вошел в Facebook, и мы пытаемся войти в него через Facebook.login в классах AS3, предоставляемых Adobe, вызывается обратный вызов, но параметрырезультат: объект и ошибка: объект ОБА нулевой.Если наш пользователь затем пытается войти снова, все работает нормально, возвращая идентификатор пользователя в результате: Объект в случае успеха.

Это ошибка в самом 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 ]

4 голосов
/ 21 июля 2011

это способ подключения к Facebook с помощью Graph API.Все объясняется в комментариях.Это на самом деле подключение к 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> 

И вам также нужен div с именем fb-root, объявленный так:

<body>
    <div id="fb-root"></div>
    <div id="flashContent">
    </div>
</body>
2 голосов
/ 08 декабря 2011

_extendedPermissions = { perms : "read_stream, publish_stream, user_about_me, read_friendlists, user_photos"};Цитата

"perms" теперь является "scope"

{ scope : "read_stream, publish_stream, user_about_me, read_friendlists, user_photos"};

Это не очень хорошо задокументировано на странице API Adobe Facebook.

2 голосов
/ 21 июля 2011

Это немного грязно, но для меня тайм-аут перед вызовом входа работал нормально:

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

0 голосов
/ 06 октября 2012

Добавьте https для all.js в теге, который вы используете в html-файле

0 голосов
/ 04 декабря 2011

Это работает для меня, если я не вошел в систему, или если я уже:

        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 :(
                }            
        }
0 голосов
/ 10 ноября 2011

КОРОТКИЙ ОТВЕТ

Просто продолжайте цикл Facebook.init () каждые 0,5 секунды, пока он не найдет действительный файл cookie с учетными данными.

ДОЛГО ОТВЕТ

Документы описывают Facebook.init () как функцию настройки. Но он делает больше, он ищет действительный файл cookie fb logon. Как и 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 - так что вы будете иметь постоянный поток всплывающих окон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...