| Astraport |
22.10.2012 23:02 |
Проблема получения доступа к элементам SWF в AIR для iOS
Как известно политика безопасности не разрешает использовать вторичные SWF с кодом в iOS. Но в моем случае, в SWF запакованы только ассеты (Movie clip) с разными instance names. Поэтому проблем не должно быть в принципе.
Итак, скачиваем SWF с сервера обычным лоадером, сохраняем в applicationStorageDirectory, затем добавляем на сцену тоже лоадером и все прекрасно работает. Но только в дебаговой версии. Компилируем в ad hoc и ассеты не добавляются. Сами понимаете, нормальных трейсов в таком режиме нет, Монокль для iOS не распространяется, ошибок нет, приходится обходиться визуальными трейсами в самописном окне.
Пробуем понять причину:
Код AS3:
bgInfo //это полученный после загрузки swf LoaderInfo и судя по размеру totalBytes там все как нужно
_background = new (getSkinClass(bgInfo, "mcBG"))() as DisplayObject;
_background.x = (stage.stageWidth - _background.width) / 2;
_background.y = (stage.stageHeight - _background.height) / 2;
addChild(_background);
bgInfo.applicationDomain.getQualifiedDefinitionNames().length;// здесь у нас NaN
getDefinitionNames(bgInfo);//это класс etc, за что ему отдельное спасибо, но тоже не спасет, здесь вообще ничего не происходит, пусто.
public static function getSkinClass(asset_info:LoaderInfo, skinAsset:String):Class{
try{
var assetClass:Class = asset_info.applicationDomain.getDefinition( skinAsset ) as Class;
return assetClass;
} catch(e:Error) {
throw new IllegalOperationError( 'getSkinAsset( ' + skinAsset + ' ) - error msg: ' + e.message );
}
return null;
}
Что тут может быть не так? Почему такие проблемы? Бьюсь почти месяц. AIR SDK 3.3, 3.4, 3.5. Flex SDK 4.6, 4.8 - в любых комбинациях.
Прошу помочь любыми советами, наводками.
Добавлено через 10 минут
Да и ещё. Те же самые SWF прекрасно загружаются тем же кодом главного приложения, если находятся в папке с приложением (applicationDirectory). Ну это ещё можно перенести. Но совершенное чудо происходит, если сделать такой финт - не скачивать SWF с сервера, а просто скопировать (программно) из папки applicationDirectory в папку applicationStorageDirectory и потом уже от туда добавлять на сцену лоадером (код добавления везде один и тот же, меняются только урлы) - часть ассетов нормально добавляется, часть не добавляется. Без всякой логики и причин.
|