вторник, 30 октября 2012 г.

navigateToURL в цикле (Action Script)

Преамбула:
Возникла необходимость последовательно открывать в браузере несколько ссылок на ресурсы.

Проблема:
При последовательном или в цикле вызове функции navigateToURL отрабатывает всего лишь один вызов.

Решение:
  1. Приложение работает в standalone flashplayer-е или в среде flash-плагина браузера:
    const URLS:Array = ["http://ya.ru", "http://r0.ru"];
    stage.addEventListener(Event.ENTER_FRAME, function (e:Event):void {
        navigateToURL(new URLRequest(URLS.shift()), "_blank");
        if (URLS.length == 0) {
            e.target.removeEventListener(e.type, arguments.callee);
        }
    });
    
    Прим.: В качестве источника события Event.ENTER_FRAME можно использовать любой экземпляр класса Sprite или его наследников в независимости добавлен ли этот экземпляр в список отображения или нет.
  2. Приложение работает в среде flash-плагина браузера, доступен и разрешен вызов javascript-методов, то можно обойтись без подписки на событие Event.ENTER_FRAME:
    const URLS:Array = ["http://ya.ru", "http://r0.ru"];
    if (ExternalInterface.available) {
        for each (var url:String in URLS) {
            ExternalInterface.call("window.open", url);
        }
    }
    

пятница, 26 октября 2012 г.

As3/Flex offline-документация на русском (Action Script, Flex)

Преамбула:
Взбрендило мне заиметь документацию по as3 оффлайн - на тот случай когда интернета нет, а очень надо.

Проблема:
Поверхностный поиск в google не дал приемлемых результатов: ни по русской, ни по английской версии нет удобоваримой документации по классам as3, которую можно качнуть архивом.

Решение:
Нашлась программка Doc, написанная на AIR-е, в которой можно добавить путь до "книги" (в моем случае он http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/). Затем она очень долго её выкачивала (~800 MB), индексировала и писала все это в локальную SQLite-базу.

К слову сказать, мне эта прога не понравилась: неудобно - внутристраничные ссылки не обрабатываются, т.е. при клике на метод или поле перехода в нужное место на странице не происходит.

НО! Главное, что эта программка скачала требуемую документацию пригодную для offline-использования. Спасибо ей за это. Забираем скачанное, анинсталим программку, пользуемся докой.

На случай ядерной войны выложил плотно упакованный 7-zip-ом архив с документацией:
Версия документации по состоянию на октябрь 2012.
As3DocumentatonOffline.7z (~11 MB, MD5: 891d9c8d6d4ba211fbd9087a2adf8f4e)

среда, 24 октября 2012 г.

Доступ к ресурсам защищенным Basic authentication (ActionScript, Basic Authorization)

Преамбула:
При разработке десктопного приложения на AIR столкнулся с проблемой доступа к ресурсам защищеным Basic access authentication или по-простому базовой авторизацией. Причем ресурсы расположены на разных серверах, условно site1.ru и site2.ru.
  • site1.ru – серверная часть приложения
  • site2.ru – хранилище статических ресурсов (картинки, флешки и прочая мультимедия)
При работе аналогичного приложения в среде flash-плагина браузера проблем нет, прошел авторизацию на каждом сервере один раз за сеанс работы браузера и шпарь себе дальше.

Проблема:
Для базовой авторизации необходимо в HTTP-запросе передавать заголовок Authorization с данными по логину и паролю.
Добавить нужный заголовок в URLRequest не представляется возможным из-за ограничений URLRequestHeader.
Нельзя, а хочется, воспользоватся такими средствами как загрузчик LoaderMax.

Решение:
Способ №1
Есть отличная библиотека as3httpclient с реализацией на сокетах аналога URLLoader-а и URLRequest-а которые позволяют добавить необходимые заголовки в HTTP-запрос.
var loader:SocketURLLoader = new SocketURLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);

var request:SocketHTTPRequest = new SocketHTTPRequest();
request.url = "http://site1.ru";
request.requestHeaders = [new URLRequestHeader("Authorization", "Basic dXNlcjpwYXNzd29yZA==")];
loader.load(request);
dXNlcjpwYXNzd29yZA== 
это сериализованная в base64 строка "user:password".
Этот способ хорош для выполнения запросов обращеных к серверу бизнес-логики приложения и не удобен для загрузки статических ресурсов (в частости изображений) которые придется грузить в бинарном виде, заталкивать их в экземпляр класса Loader или другой класс для использования загруженного ресурса.

Способ №2
Как оказалось все уже придумано самими адобами.
Надо по-внимательней смотреть в документацию!
Встречайте URLRequestDefaults.
Достаточно один раз указать данные для авторизации, скажем в конструкторе главного класса приложения:
URLRequestDefaults.setLoginCredentialsForHost("site1.ru", "user", "password");
URLRequestDefaults.setLoginCredentialsForHost("site2.ru", "user", "password");
URLRequestDefaults.authenticate = true;