Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Передача данных из приложения Air в Swf через LocalConnection (http://www.flasher.ru/forum/showthread.php?t=208159)

australian incognito 10.06.2014 01:36

Передача данных из приложения Air в Swf через LocalConnection
 
Ниже код для приложения Air (Sender.fla):
Код AS3:

var lc:LocalConnection = new LocalConnection();
lc.send("_myConn", "syncAllItems", "Hello world!");

Далее код для обычного файла SWF (Reseiver.fla):
Код AS3:

var localConnection:LocalConnection = new LocalConnection();
localConnection.allowDomain("*");
localConnection.client = this;
localConnection.connect("_myConn");
 
//
function syncAllItems(t:String):void
{
        my_txt.text = t;
}

Проблема в том, что при тестировании внутри флеша, все работает хорошо, как работает хорошо, если первый файл публикуется в SWF, а не Air Installer. Если же пробуем запускать все локально (нужно именно локальное взаимодействие в рамках одного ПК), то файл SWF выдает ошибку:
Error #2044: Unhandled SecurityErrorEvent:. text=Error #2047: Security sandbox violation: LocalConnection.send: app#Sender cannot access file:///Users/volcanoflash/Dropbox/Reseiver.swf.

Оба файла при этом лежат в одной директории... Опробовано и на Mac и на Win.

Помогите советом, коллеги!

caseyryan 10.06.2014 08:19

Вот тут надо добавить эту директорию в список доверенных

australian incognito 10.06.2014 12:06

Спасибо огромное. Я убил кучу времени, пытаясь понять в чем заговздка.

caseyryan 10.06.2014 12:18

Но это если нужно только для своего компа. Заставлять юзеров делать это не вариант.

australian incognito 10.06.2014 13:51

А подскажите еще, что нужно, чтобы избежать этой проблемы: надежный сертификат разработчика? или что-то другое? Иначе выходит, что LocalConnection между Air и Swf в принципе не возможен...

ShockWave512 11.06.2014 01:17

Если у вас первое приложение именно AIR, то можно смотреть в сторону ServerSocket:
http://help.adobe.com/en_US/FlashPla...verSocket.html

SpetZ_Naz 18.02.2015 01:03

Хотелось бы приподнять данную тему дабы новую не открывать.

Столкнулся с такой же проблемой. Создал локальное приложение AIR (Флеш) - грузит в себя флешку через Loader и добавляет его на сцену (все ОК, грузит). Загружаемая в AIR флешка создана мною как Web приложение написанное на Flex. Теперь из AIR приложения в загруженную SWF нужно передать параметр (текст или массив), обработать его там и вывести в этой же флешке результат.

Для чего мне это нужно. В AIR (Флеш) нет компонента Tree (древовидное отображение массива). А мне он нужен. К сожалению не разобрался как воспользоваться сторонними реализациями Tree компонента под флеш, поэтому решил попробовать подгрузить Flex флешку.

Воспользовался LocalConnection для связи AIR с SWF. Если не вгружать SWF в AIR, то все работает, параметр передается, связь удачна. Проблемы начинаются с загрузкой swf в AIR :(

В общем код AIR который делает запрос в загруженный swf:

Код AS3:

//обработчик события нажатия на кнопку, что грузит swf-файл
 
// глобальная область объявления переменных
private var loader:Loader;
private var lc:LocalConnection;
 
private function on_statButton_ButtonMouseCLICK_Handler(event:MouseEvent):void
{
      loader = new Loader();
      var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
 
      // пробовал и так:
      // context.securityDomain = Security.sandboxType == Security.REMOTE ? SecurityDomain.currentDomain : null;
 
      myrequest = new URLRequest('treeView_folder\\treeW.swf');
      loader.load(myrequest, context);
 
      loader.x = 70;
      loader.y = 100;
 
      myForm.addChild(loader);
 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLICompleteHandler);
}
 
protected function onLICompleteHandler(event:Event):void
                {
                        loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLICompleteHandler);
                        lc = new LocalConnection();
                        lc.addEventListener(StatusEvent.STATUS, onLCSTATUS_Handler);
                        lc.send('app#myApp.tech:_treeConnection', '_setParam', 'параметр передан, успех');
                        trace(lc.domain)// выдает -->  app#myApp.tech
                }
 
protected function onLCSTATUS_Handler(event:StatusEvent):void
                {
                        lc.removeEventListener(StatusEvent.STATUS, onLCSTATUS_Handler);
                        switch (event.level) {
                                case "status":
                                        trace("LocalConnection.send() succeeded");
                                        break;
                                case "error":
                                        trace("LocalConnection.send() failed");
                                                                          // Постоянно выбивает сюда, ошибка соединения
                                        break;
                        }
                }

Код загружаемого swf (Flex) в AIR:

Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
                          xmlns:s="library://ns.adobe.com/flex/spark"
                          xmlns:mx="library://ns.adobe.com/flex/mx"
                          minWidth="840" minHeight="600" backgroundColor="#666633"
                          applicationComplete="init()">
 
        <fx:Script>
                <![CDATA[
                        import mx.controls.Alert;
                        private var lc:LocalConnection = new LocalConnection();
 
                        private function init():void
                        {
                                lc.client = this;
 
                                lc.addEventListener(StatusEvent.STATUS, onLCStatus);
 
 
                                        lc.allowDomain('*');
 
                                        try{ 
                                                lc.connect('_treeConnection');
                                                Alert.show('lc.domain'); // После загрузки в Air выдает app#myApp.tech  - тоесть домены одинаковые
                                                }catch(error:ArgumentError){ 
                                                Alert.show("Error: It can not connect your correct domain.")
                                                } 
                        }
 
                        public function _setParam(par:String):void
                        {
                                label_1.text = par;
                        }
 
                        protected function onLCStatus(event:StatusEvent):void
                        {
                                switch (event.level) {
                                        case "status":
                                                label_1.text =  "LocalConnection.send() succeeded";
                                                break;
                                        case "error":
                                                label_1.text =  "Cant connect...the connection name is already being used by another SWF";
                                                break;
                                }
 
                        }
 
                ]]>
        </fx:Script>
        <mx:Tree x="24" y="22" width="280" height="319" contentBackgroundColor="#A0A086"
                        dataProvider="{Передам сюда массив в будуущем}" labelField="@label"></mx:Tree>
        <s:Label id="label_1" x="328" y="26"  />
 
</s:Application>

В первой части блока с кодом AIR приложения пытался разрешения давать:
Код AS3:

try {
      Security.allowDomain("app#myApp.tech");
      }
      catch (e:Error)
    {
    trace(e.message);
                                // Error #3207: Application-sandbox content cannot access this feature.
    };


До того как задать вопрос пошастал по подобным темам у нас на форуме, за рубежом, но видимо не понял как решить проблему.

Подскажите пожалуйста, где я ошибся и что поправить?


.

Добавлено через 24 часа 7 минут
Ошибку выявил.. команда загруженной флешке посылалась раньше чем она грузилась полностью.. Решение: поставил таймер на 1 секунду по завершению загрузки в обработчик события onLICompleteHandler. Команда send посылается при срабатывании события TIMER.

Поговорил сам с собой, спасибо мне ))


Часовой пояс GMT +4, время: 19:14.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.