loadMovieNum в файлах AS2 / 1, загруженных в Air-based приложение AS3 / Flex - PullRequest
1 голос
/ 24 августа 2011

Я работаю с очень большим количеством устаревших SWF, написанных на AS1 и AS2.Эти SWFs широко используют loadMovieNum.

Я пытаюсь интегрировать их в новое приложение на основе Air (написанное на AS3 или Flex).Однако loadMovieNum, похоже, не работает в приложении Air.

Например, SWF AS2 (file1.swf) может попытаться загрузить другой SWF AS2, используя:

loadMovieNum("http://127.0.0.1/file2.swf", 5);

Это прекрасно работает, если SWF-файл воспроизводится независимо, но если он воспроизводится из приложения Air, происходит сбой.

EDIT: В приложении Air происходит то, что file1.swf будетзагрузка успешно, но молча не удается загрузить file2.swf.Здесь нет ошибок и исключений.try...catch вокруг loadMovieNum ничего не сообщает, а file1.swf продолжает играть.

Соответствующий код из приложения Air выглядит следующим образом:

Версия AS3:

var mLoader:Loader = new Loader();
var mRequest:URLRequest = new URLRequest("http://127.0.0.1/file1.swf");
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
mLoader.load(mRequest, loaderContext);

function onCompleteHandler(loadEvent:Event):void
{
    // Add to the stage
    addChild(mLoader.content.parent);
}

Версия Flex:

<mx:SWFLoader id="swfObj" source="http://127.0.0.1/file1.swf" />

Это просто случай, когда loadMovieNum не будет работать в воздухе?Или есть что-то, что можно сделать.Очевидно, что внесение существенных изменений в устаревшие SWF-файлы, по всей вероятности, невозможно.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

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

Я создал быстрый пример просто для проверки этой теории, и я был прав.Причина, по которой он работает во Flash, заключается в том, что контент AS2 находится в той же песочнице, что и загружаемый контент.Но безопасность AIR отличается.Поэтому, когда вы загружаете контент AS2 в AIR (используя предоставленную вами логику), загрузчик помещается в изолированную программную среду приложения.Песочница теперь отличается от содержимого, которое она загружает, поэтому она отказывается загружать их.Это объясняет, почему это работает при использовании обертки HTML.Когда HTML-файл загружает SWF-файл, он, вероятно, помещается в изолированную программную среду с локальной сетью, которая совпадает с содержимым.

Итак ... Как это исправить? Вы можете попытаться загрузить свой контент в другую изолированную программную среду безопасности.Но на самом деле проблема в том, что безопасность AS3 не очень хорошо сочетается с безопасностью AS2.Мое предложение было бы создать приложение AIR без оболочки AS3.Вы не можете сделать это непосредственно в инструменте, но вы должны быть в состоянии использовать упаковщик ADT, чтобы сделать это.В дескрипторе xml сделайте исходное содержимое swf AS2 и упакуйте его вместе.Теперь, когда вы запускаете приложение AIR, оно использует swf AS2 в качестве основного приложения.Внезапно все ваши файлы должны оказаться в одной изолированной программной среде безопасности, и Flash не помешает запуску любого содержимого.

Вы можете проверить это локально, используя ADL для запуска приложения вместо запуска его непосредственно из FlashПрофессиональный или Flash Builder.(Они оба используют ADL, но если вы вызываете его напрямую, у вас больше контроля над используемыми аргументами.)

РЕДАКТИРОВАТЬ: Очевидно, вы не можете использовать SWF-файл AS2 в качестве основного SWF дляНастольные приложения AIR.(Я тестировал использование ADL на настольном компьютере, и он работает, но мне сказали, что вы не сможете установить приложение AIR на настольном компьютере с этой настройкой.) Так что для настольного компьютера вы, вероятно, захотите использовать обходной путь HTML. Это поддерживается в AIR for TV , поэтому это будет работать на этих устройствах.

0 голосов
/ 25 августа 2011

Я пришел к выводу, что _level не поддерживаются в SWF, которые загружаются непосредственно в приложения Air. Например, даже _level0 (который всегда должен быть определен) возвращается как undefined. Следовательно, очень маловероятно, что loadMovieNum будет поддерживаться.

Однако я нашел обходной путь. Используя компонент браузера HTML в Air, в приложение Air можно загрузить веб-страницу, в которую встроены SWF-файлы AS2 / 1. Если вы сделаете это, то loadMovieNum будет работать как положено в файлах AS2 / 1.

AS3 версия:

var hLoader:HTMLLoader = new HTMLLoader();
addChild(hLoader);
hLoader.width = stage.stageWidth;
hLoader.height = stage.stageHeight;         
hLoader.load(new URLRequest("file1.html"));

Версия Flex:

<mx:HTML id="minibrowser" width="100%" height="100%" location="file1.html" />

К сожалению, компонент HTML поддерживается не всеми профилями Air. В частности, в моем случае он не поддерживается профилем телевизора.

...