Мне не удается использовать локальное соединение между главным файлом, установленным для AIR, и подчиненным файлом для FlashPlayer (обычный SWF). Вот код двух тестовых файлов ...
Мастер-файл / получатель:
// test-AIR.fla
import flash.display.Loader;
var loadK1:Loader=new Loader();
loadK1.load(new URLRequest("K1/test-SWF.swf"));
addChild(loadK1);
var localConnection:LocalConnection = new LocalConnection();
localConnection.allowDomain("*");
localConnection.client = this;
localConnection.connect("_connectionName");
function onMethod(timeString:String):void {
trace("onMethod called at: " + timeString);
}
Отправитель ...
// K1/test-SWF.fla
var localConnection:LocalConnection = new LocalConnection();
localConnection.send("_connectionName", "onMethod");
trace("END of test-SWF.swf");
Затем вот вывод, показывающий, что onMethod не вызывается:
[SWF] test-AIR.swf - 1170 bytes after decompression
K1/test-SWF.swf - 625 bytes after decompression
END of test-SWF.swf[SWF]
Такое ощущение, что все перепробовала. Может ли кто-нибудь указать, что не так или что мне не хватает? Спасибо,
Спасибо, все перепробовала безуспешно. Боюсь, это связано с тем, что LocalConnection не поддерживается для профиля mobileDevice: help.adobe.com/en_US/air/build/… Я ищу обходной путь. Подсказки будут очень признательны!
Зачем вам вообще нужен LC для связи в рамках одного экземпляра приложения?
Это большое приложение, изначально разработанное для веб-браузеров. Использование нескольких файлов ускоряет загрузку. Всего в нем более 10 файлов FLA / SWF. Сейчас я пытаюсь перенести его на мобильные и настольные устройства.
Взгляните на Flex ModuleLoader. В зависимости от вашей архитектуры это может быть вариант.
@Shiluba Это понятно. Но я задал не этот вопрос. LC действительно является жизнеспособным вариантом, если эти SWF-модули работают как отдельные приложения, которым необходимо взаимодействовать. Если они загружены в одно приложение, вы можете связываться напрямую (обращаясь к иерархии списка отображения) или менее напрямую (через некоторый класс диспетчеризации сообщений).
Спасибо вам обоим. Я могу попробовать ModuleLoader. Хорошо продумано, хотя Adobe говорит: «Модули не поддерживаются для мобильных приложений AIR.» help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/… @Organis Проект будет опубликован как для веб-браузеров (отдельные приложения), так и для настольных и мобильных устройств (одно приложение). Поэтому мы хотели бы, чтобы он был доступен для публикации в виде отдельных файлов для веб-браузеров. Не могли бы вы уточнить, как напрямую общаться, обращаясь к иерархии списков отображения? Думаю, что-то упускаю.
Если вы загружаете внешний SWF и устанавливаете его так, чтобы он находился в том же SecurityDomain (если вы упаковываете все SWF в один APK, вам не нужно ничего делать), тогда родитель внешнего SWF будет экземпляром Загрузчик, следовательно, parent.parent будет быть родителем Загрузчик, если вы прикрепили экземпляр Загрузчик к списку отображения основного SWF. Если оба SWF-файла находятся в одном домене SecurityDomain, они могут получать доступ к спискам отображения друг друга без ограничений.
В этом случае прямое общение путем обращения к иерархии списка отображения выглядит правильным способом. Вот что я пробовал в K1 / test-SWF.swf: var p:MovieClip = this.parent.parent as MovieClip; p.onMethod(); Таким образом, onMethod вызывается из дочернего приложения, независимо от цели публикации. Не стесняйтесь очистить / улучшить этот код, прежде чем я отправлю ответ. Спасибо еще раз.
Поскольку оба SWF-файла находятся в одном домене SecurityDomain, они могут обращаться к спискам отображения друг друга без ограничений. Таким образом, я исправил проблему, вызвав метод через иерархию списка отображения:
MovieClip(this.parent.parent).onMethod();
Таким образом, метод может быть вызван из дочернего приложения независимо от цели публикации (браузер, настольный компьютер, мобильные устройства ...).
@Organis благодарим за помощь!
Пара безумных догадок. 1. Загрузите внешний SWF-файл после, который вы установили для LocalConnection. Кто знает, возможно, он загружается и запускается на месте, прежде чем вы даже подключите приемник. 2. Подпишите все LC на все возможные события и проследите их. Могу дать вам подсказку. 3. Думаю, метод onMethod должен быть общественный. 4. Сначала попробуйте использовать его в одном SWF-файле и убедитесь, что он работает. 5. Читайте официальную документацию, нюансов масса: help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…