Цитата:
Сообщение от kosheev_me
Согласен. Но хотелось бы использовать SWFLoader. И еще один момент - такая ошибка возникает только если запускается "проигрывателем" AIR, если использовать Flash Player, то все нормально.
|
1. Как SWFLoader загружает контент?Открываем mx.controls.SWFLoader и в методе loadContent(classOrString:Object) видим:
...
loader.loadBytes(byteArray, loaderContext);
...
То есть SWFLoader загружает контент через loadBytes
2. По поводу loadBytes в приложении AIRВот что пишет официальный мануал:
Защита от динамически генерируемого небезопасного содержимого SWF
Метод Loader.loadBytes() позволяет приложению генерировать содержимое SWF из байтового массива.
Однако атаки на данные, загруженные из удаленных источников, могут причинить серьезный вред при загрузке содержимого. Особенно это относится к загрузке данных в изолированную программную среду приложения, в которой сгенерированное содержимое SWF может получить доступ к полному набору API-интерфейсов AIR.
Возможно допустимое использование метода loadBytes() без создания исполняемого кода SWF. Например, метод loadBytes() можно использовать для формирования данных изображения в целях управления временем вывода изображения. Допустимо также применение этого метода на основе исполняемого кода, например динамическое создание содержимого SWF для воспроизведения аудиоданных. По умолчанию метод loadBytes() в AIR не позволяет загружать содержимое SWF; он позволяет загружать только изображения. В AIR свойство loaderContext метода loadBytes() имеет свойство allowLoadBytesCodeExecution, которое можно установить на значение true, чтобы явно разрешить приложению использовать метод loadBytes() для загрузки исполняемого содержимого SWF. Следующий код иллюстрирует использование этой функции:
var loader:Loader = new Loader();
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.allowLoadBytesCodeExecution = true;
loader.loadBytes(bytes, loaderContext);
Если при вызове метода loadBytes() для загрузки содержимого SWF свойство allowLoadBytesCodeExecution объекта LoaderContext имеет значение false (по умолчанию), объект Loader выдает исключение SecurityError.
3. На практике:Ни при loaderContext.allowLoadBytesCodeExecution = true
Ни при loaderContext.allowCodeImport = true
НЕ получается в AIR-приложение загрузить SWF-ку, в которой присутствует секция actionscript-кода.
И наоборот, если в SWF нет секции actionscript-кода, то такая SWF загружается без проблем.
Также не возникает проблем при загрузке SWF c секцей actionscript-кода, через метод load (но в этом случае, очевидно, отсутствует возможность предварительно “поколдовать” с загружаемой SWF-кой).
4. Нюанс:Несмотря на то, что в официальной документации говорится о необходимости указания allowLoadBytesCodeExecution = true, практически в рантайме выскакивает ошибка о необходимости allowCodeImport.
5. Вот что пишет один человек на эту тему:
Re: Load "non sandbox" application swf from a server web into an AIR application
« Reply #1 on: 10 Feb 2010, 14:19:05 UTC »
A SWF loaded from the web cannot be trusted in the same way as a locally installed application. The AIR runtime will not allow an AIR app and a loaded SWF to co-exist in the same application sandbox.
5. ВыводЕсли есть желание - используй мост изолированной программной среды в AIR (parentSandboxBridge, childSandboxBridge и т.п.).
Либо таки надо просто загружать через loader::load()