Загрузка внешних SWF-файлов в приложение Adobe AIR - лучшие практики? - PullRequest
3 голосов
/ 18 октября 2011

Недавно мне было поручено перенести существующую игру на базе Flash Player в настольное приложение для публикации на платформе Steam. Платформа Adobe AIR кажется логичным выбором для распространения, особенно с учетом последних обновлений в AIR 3. Учитывая тот факт, что я относительно новичок в разработке flash / flex, я прочитал изрядное количество документации AIR в Adobe сайт, чтобы получить лучшее понимание того, что включает в себя задачу. В целом, я думаю, что у меня есть приличное представление о том, что должно произойти, но есть пара морщин, которые могут повлиять, если / как вообще возможно портировать на среду AIR:

  1. Приложению AIR потребуется загрузить фактический игровой клиент с внешнего сервера в связи с быстрым временем выполнения разработки клиента.
  2. Поскольку приложение AIR будет развернуто в Steam, я хочу использовать пакет Captive Runtime, который доступен в AIR 3.0, т. Е. Пользователю не нужно «ОК» для отдельной установки AIR.
  3. Оказывают минимальное влияние на изменения кода во внешнем SWF, так как я не являюсь основным разработчиком игры.

Моим первым приоритетом является выяснение наилучшего подхода для загрузки SWF-файла внешнего игрового клиента в приложение AIR. Сначала я пытался использовать Loader.load (), но это привело к следующему исключению:

SecurityError: Error #2070: Security sandbox violation: caller http://localhost/MyClient.swf cannot access Stage owned by app:/AS3_AIRTest.swf.
    at flash.media::SoundMixer$/set soundTransform()
    at com.company.client.sound::SFXManager$/load()
    at global/client.util::loadEmbeddedSounds()
    at MyClient()

Код ошибки:

static public function load():void {
    SoundMixer.soundTransform = 
        new SoundTransform(Client.Settings.PlaySFX ? 1 : 0);
}

Получив это исключение, я решил немного подробнее прочитать о доменах безопасности проигрывателя AIR / Flash. У меня есть более четкое понимание того, почему возникло исключение, но я все еще не уверен, как лучше всего загрузить SWF-файл и не получить указанное выше исключение.

Изучив многочисленные сообщения на различных форумах, я обнаружил, что ряд разработчиков используют Loader.loadBytes () для переноса SWF в изолированную программную среду приложения. С точки зрения простоты реализации я понимаю, почему многие выбирают этот путь; однако я не склонен придерживаться этого подхода из-за потенциальной опасности для пользовательских систем в случае взлома внешнего сервера.

Второй подход, о котором я читал, состоит в том, что я могу использовать мост сценария песочницы и написать интерфейс для предоставления определенных привилегий внешнему клиентскому SWF. Я не решаюсь идти по этому пути в данный момент, потому что игровой клиент довольно сложный, и я не совсем уверен, сколько ему потребуется доступа к сцене через различные Flash API. Я не списал этот подход, так как он звучит так, как будто это лучшая ставка, но потенциально это может быть большое усилие, и я хочу оказать минимальное влияние на SWF клиента.

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

Это приводит меня к следующим вопросам:

  1. Правильно ли мое мышление по поводу приложения HTML?
    • Будет ли клиент SWF иметь доступ к своей собственной сцене и будет вести себя так же, как в Flash Player?
  2. Можно ли связывать приложения AIR на основе HTML с незапланированной средой выполнения?
  3. Могу ли я использовать традиционное Flex-приложение с HTMLLoader для достижения той же цели или это должно быть полноценное HTML-приложение?
    • Если можно использовать HTMLLoader, нужно ли указывать метатеги моста сценария песочницы в теге iframe?

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

Еще раз спасибо.

Джош

Ответы [ 2 ]

0 голосов
/ 19 октября 2011

(длинный вопрос с большим количеством точек, но здесь идет речь)

  1. Вы правы, что прохождение объекта Stage через мост сценария не будет работать.Поэтому необходимо удалить код, который обращается к сцене, и, возможно, использовать скрипт-мост для выполнения работы в каждом конкретном случае.
  2. Если вы встраиваете SWF-файл в HTML-страницу, он действительно получит свой собственныйэтап.Не имеет значения, является ли это приложение AIR на основе HTML или приложение на основе ActionScript, использующее HTMLLoader.(На самом деле это одно и то же.) Для этого вам не нужен iframe.Это звучит как самый простой подход, особенно если вы не добавляете много специфичных для AIR функций.
  3. Информацию о подписывании см. http://www.adobe.com/devnet/air/flex/quickstart/articles/xml_signatures.html

Другая вещьЯ бы посмотрел, если вы еще этого не знаете, какие возможности предлагает Steam для таких обновлений.Действительно ли время для загрузки нового проекта / обновления в Steam превышает время, необходимое для добавления этой системы послеустановочного обновления в само приложение?(Я надеюсь, что вы не находитесь в одной из тех ситуаций Дилберта, где на бумаге кажется, что вы можете сэкономить время, делая странные вещи. По моему опыту, чудеса, создаваемые перетаскиванием ползунков в Microsoft Project (или тому подобное), не 'не получается.)

0 голосов
/ 18 октября 2011

Вы уже много исследовали.Я собирался упомянуть технику Loader.loadBytes, но вы упомянули, что она небезопасна.На самом деле вы могли бы позаботиться о безопасности, если бы знали подписанные хеши SWF-файлов, которые могут быть загружены.Я помню, что читал этот подход в блоге менеджера команды AIR, но сейчас не могу вспомнить ссылку.По сути, этот подход сработал бы, если бы вы заранее знали все SWF-файлы, которые можно было бы загрузить, а затем сгенерировали их подписанные хэши и поместили эти хеши в XML-файл, поставляемый с исходным приложением AIR.Затем первоначальное приложение AIR может загрузить эти SWF-файлы, сравнить их подписи и загрузить их в изолированную программную среду приложения, если оно соответствует отправленным хэшам и т. Д.

...