Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.09.2011, 22:55
kosheev_me вне форума Посмотреть профиль Отправить личное сообщение для kosheev_me Найти все сообщения от kosheev_me
  № 1  
Ответить с цитированием
kosheev_me

Регистрация: Jul 2010
Сообщений: 23
По умолчанию Загрузка локального swf файла в SWFLoader

Всем привет!
Делаю AIR-проект. Нужно загрузить локальный swf файл. Хочу использовать для этого mx.controls.SWFLoader. Код выглядит приблизительно так:
Код AS3:
protected function onBrowse(event:MouseEvent):void
{
	var clipFile:File = new File();
	var filter:FileFilter = new FileFilter("Clip files", "*.swf;*.png");
 
	try {
		clipFile.browseForOpen("Open", [filter]);
		clipFile.addEventListener(Event.SELECT, onFileSelected);
	}
	catch (e:Error) {
 
	}
}
 
protected function onFileSelected(e:Event):void
{
	var clipFile:File = File(e.target);
 
	preview.source = clipFile.nativePath;
}
 
<s:SWFLoader id="preview" x="10" y="110" width="203" height="147"
		 horizontalAlign="center" verticalAlign="middle"/>
В принципе файл загружается, но в консоль попадает вот такое сообщение:

*** Security Sandbox Violation ***
SecurityDomain 'file:///hero.swf' tried to access incompatible context 'app:/builder.swf'

p.s. проект у меня называется builder.swf, а файл, который я загружаю - hero.swf

Читал, что в AIR Security Sandbox как-то отличается от Flash Player'а (правда так и не понял чем). Что можно применить в моем случае?

Старый 26.09.2011, 21:10
kosheev_me вне форума Посмотреть профиль Отправить личное сообщение для kosheev_me Найти все сообщения от kosheev_me
  № 2  
Ответить с цитированием
kosheev_me

Регистрация: Jul 2010
Сообщений: 23
Не ужели никто не сталкивался с такой проблемой?

Старый 29.09.2011, 20:44
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 3  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
Через loader::load() грузится без проблем.

Старый 30.09.2011, 19:38
kosheev_me вне форума Посмотреть профиль Отправить личное сообщение для kosheev_me Найти все сообщения от kosheev_me
  № 4  
Ответить с цитированием
kosheev_me

Регистрация: Jul 2010
Сообщений: 23
Согласен. Но хотелось бы использовать SWFLoader. И еще один момент - такая ошибка возникает только если запускается "проигрывателем" AIR, если использовать Flash Player, то все нормально.

Старый 01.10.2011, 01:25
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 5  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
Цитата:
Сообщение от 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()

Старый 04.10.2011, 20:11
kosheev_me вне форума Посмотреть профиль Отправить личное сообщение для kosheev_me Найти все сообщения от kosheev_me
  № 6  
Ответить с цитированием
kosheev_me

Регистрация: Jul 2010
Сообщений: 23
Спасибо за развернутый ответ. Все получилось.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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