То, что недавно казалось фантастикой, сегодня уже реальность. Начиная с версии FlashPlayer'a 10.1 у класса Microphone появилось событие sampleData.
SampleDataEvent
Это событие отправляется когда в буфере микрофона появляются аудио-данные. Событие имеет свойство data, которое содержит образцы записанных с микрофона данных. Естественно данные приходят в сыром формате. И проиграть их вне FlashPlayer'a не получиться. Поэтому их необходимо декодировать, предварительно собрав необходимое количество в бинарный массив ByteArray.
//// Объявляем бинарный массив для хранения полученных с микрофона аудио-данныхvar _samples_arr:ByteArray = new ByteArray();;
//// Получаем экзмпляр микрофонаvar _microphone:Microphone = Microphone.getMicrophone(-1);
//// Вешаем обработчик события
_microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onMicrophoneSampleData, false, 0, true);
//// Обработчик обновления данных в микрофоне
function onMicrophoneSampleData (e:SampleDataEvent):void
{
//// Добавляем полученные данные в биннарный массив
_samples_arr.writeBytes(e.data);
}
Специально для этого в Adobe написали класс WAVWriter.as. Останавливаться на нём не будем, потому что он довольно простой в использовании:
//// Объявляем бинарный массив для данных .wav-файлаvar wav_file:ByteArray = new ByteArray();
//// Объявляем и настроиваем энкондерvar writer:WAVWriter = new WAVWriter();
writer.numOfChannels = 1;
writer.sampleBitRate = 16;
writer.samplingRate = 44100;
//// Декодируем данные с микрофона в wav-формат
writer.processSamples(wav_file, _samples_arr, 44100, 1);
Теперь, фактически получив бинарные данные аудио-файла в .wav-формате, казалось бы мы выполнили задачу и остается только сохранить их в файл.
Но мы пойдем дальше. И рассмотрим преобразование наших данных в .mp3-формат. Да, такое уже возможно и реализовано. Говорим спасибо Cyril Diagn за его работу в этом направлении, а именно проект Shine MP3 Encoder on Alchemy.
Shine MP3 Encoder on Alchemy
Это .swc-библиотека с классом ShineMP3Encoder для преобразования данных из .wav-формата в .mp3. Код портирован с помощью Alchemy из энкодера написанного на С, автором которого является Gabriel Bouvigne.
Пример использования:
//// Обнуляем позицию в массиве .wav-файла
wav_file.position = 0;
//// Объявляем mp3-энкодерvar _mp3_encoder:ShineMP3Encoder = new ShineMP3Encoder(wav_file);
//// Вешаем обработчики событий
_mp3_encoder.addEventListener(Event.COMPLETE, onMP3EncoderComplete, false, 0, true);
_mp3_encoder.addEventListener(ProgressEvent.PROGRESS, onMP3EncoderProcess, false, 0, true);
//// Начинаем кодирование
_mp3_encoder.start();
//// Обработчик процесса кодирования
function onMP3EncoderProcess (e:ProgressEvent):void
{
trace("Encoding to mp3 ... " + Math.ceil(e.bytesLoaded * 100 / e.bytesTotal) + "%");
}
//// Обработчик завершения кодирования
function onMP3EncoderComplete (e:Event):void
{
trace("Encoding to mp3 complete!")
}
Теперь, после преобразования мы можем сохранить .mp3-файл штатными средствами энкодера. Для этого имеется метод saveAs()
_mp3_encoder.saveAs('record.mp3');
Если же есть необходимость отправить полученный .mp3-файл на сервер, мы можем сделать это самостоятельно, получив его данные во свойстве mp3Data.
var mp3_file:ByteArray = _mp3_encoder.mp3Data;
Ну и как обычно, простейший пример всего вышеописанного:
С недавнего времени в контекстном меню FlashPlayer'a появился новый пункт "Глобальные настройки". А именно с версии 10.3.
Если с "Хранилищем", "Камерой и микрофоном" и "Воспроизведением" всё понятно (они итак были доступны в пункте "Параметры..."), то вот во вкладке "Дополнительно" появились доколе неизвестные настройки.
Подробнее я хочу остановить на "Настройках доверенной папки..."
Что за доверенная папка?
На самом деле слово "папки" немного вводит в заблуждение. Естественно здесь указываются .swf-файлы, которым пользователь явно доверяет. А именно:
домен, с которого загружаются .swf-файлы,
путь к локальному .swf-файлу на компьютере пользователя,
путь к локальному каталогу, в котором содержаться .swf-файлы
И что же мы доверяем (разрешаем) указанным файлам?
С версии 10.1 локально запущенным .swf-файлам запрещается загружать данные из сети и из локального диска пользователя. Так вот указав, что этот .swf-доверенный ему разрешается делать эти запросы.
Сделано это для того, чтобы на этапе разработки было не обязательным постоянно выкладывать приложение на сервер.
Для чего указывается домен и что мы ему доверяем, я так и не разобрался. В cправке тоже ничего по поводу доменов. Может разрешаем локальным .swf-файлам загружать данные с этого домена? Не знаю. Не проверял. Может быть вы знаете?
К чему я завел этот разговор?
Недавно пришлось вернуться к одному старому проекту. Проект представляет собой простую презентацию с видео и небольшим каталогом. И вот тут, я столкнулся с тем, что главный .swf-файл зашитый в .exe-файл FlashPlayer'a не может подгрузить данные с каталога, который лежит рядом. Получаю сообщение с ошибкой о нарушении политики безопасности. Удивление конечно было огромным, когда я узнал, что в новых версиях плеера этого делать нельзя.
Чтож? Пришлось разбираться...
Как лечиться?
Ну во-первых, указать доверенный .swf-файл может сам пользователь в соотвествующем окне, о котором я говорил выше.
Во-вторых, можно сделать это за пользователя (естественно с помощью каких-то оберток или стартеров). Для этого в системе (в качестве примера возьму Windows 7, об остальных операционных системах информацию можно найти в справке) имеются каталоги, в которых хранятся .cfg-файлы конфигурации безопасности FlashPlayer'a. Таких каталогов два:
В эти каталоги можно добавлять свои .cfg-файлы с любым именем. Простой текстовый файл, где каждая строчка - это путь до доверенных .swf-файла или папки.
Все современные среды разработки создают свои .cfg-файлы и при создании проекта дописывают в него в качестве доверенной папки папку нового проекта. Именно поэтому многие не заметили этого нововведения. Например FlashDevelop создает вот этот файл:
А для профилактики подобных ситуаций автор кода может узнать каким образом запущен .swf-файл. Для этого существует свойство Security.sandboxType
Итого
Adobe окончательно уводит FlashPlayer с локального использования в веб. Не пишите больше локальных приложений для него, без оберток, таких как Zinc или AIR.
Часто вы сталкивались с ситуацией, когда ваш код не работает по непонятным причинам? Вам кажется, что всё уже проверено сотни раз и вы с уверенностью говорите себе, что здесь нет ошибок, и уже готовы биться головой о клавиатуру :) Спешу вас утешить, скорее всего ошибка не в коде.
В чем же дело?
А дело может быть в том, что вы нарушаете политику безопасности Flash Player, сами того не зная. Иногда Flash Player просто промолчит об этом :)
Как это предупредить?
Если что-то не работает, а по логике должно - идите в справку. Там кроются все ответы на ваши вопросы. Вообще справка должна быть неотъемлемым инструментом разработчика.
В этом посте я хочу рассказать о наиболее частых нарушениях политики безопасности, с которыми мы сталкиваемся.
Загрузка контента с доменов отличных, о того с которого запущена страница с .swf-файлом
*.load();
Практически на весь загружаемый контент с других доменом и даже поддоменов накладываются ограничения на загрузку, отображение или исполнения сценариев (если вы загружаете исполняемый .swf-файл). Например, .swf-файл не выполнит свой сценарий, если вы загрузили его без разрешения.
BitmapData.draw();
Метод не отрисует дисплей объект, если в нем есть загруженный контент с другого домена без разрешения. Это касается дочерних элементов класса Loader, и даже TextField, если в нем есть картинки вставленные посредством HTML-разметки.
Возможно эти ограничения действуют и в других методах, с которыми я не сталкивался. Так что если, что-то упустил - добавляйте в комментариях.
Как получить разрешение?
Домен, с которого вы грузите контент, должен разрешить вам использовать его. Делается это двумя способами в зависимости от типа загружаемого контента.
1. checkPolicyFile
Это файл, где перечислены домены, которым разрешено использовать контент. Называться такой файл должен сrossdomain.xml и лежать в корне сайта. Содержимое должно выглядеть следующим образом:
Когда .swf-файл, запущенный с вашего домена, пытается выполнить запросы на другой домен, Flash Player делает автоматически делает запрос на сrossdomain.xml расположенный на другом домене. Если в нем указано разрешение для вашего домена, то Flash Player разрешит в полной мере выполнять запросы.
2. Security.allowDomain() или Security.allowInsecureDomain()
Этот способ предусмотрен для исполняемых .swf-файлов. Если Flash Player встретит в сценарии метод Security.allowDomain() или Security.allowInsecureDomain() (для https-протокола) с параметром равным доменному имени вашего сайта, то он разрешает исполнение сценариев на вашем сайте.
System.allowDomain("yoursite.com");
Взаимодействие с клиентским окружением
Еще одной из частых и самых болезненых, является ситуация когда не выполняются методы никак не связанные с сетью. Болезнь заключается в том, что Flash Player, просто молчит о нарушениях. Приведу список наиболее частых методов, в которых мы сталкиваемся с этим.
FileReference.browse();
Метод не выполнится, если внутри .swf-файла не было события нажатия клавиши мыши.
SharedObject.flush();
Метод не выполнится если размер .swf-файла встроенного на страницу меньше окна с параметрами Flash Player'a (215 x 128).
LocalConnection.send();
Метод не выполнится если вкладка со страницей, на которой запущен .swf-файл, неактивна.
Метод не выполнится, если внутри .swf-файла не было события нажатия мыши.
...
Если вы сталкивались еще с чем-то подобным, пишите в комментарии я дополню этот список.
Доступ к HTML-окружению на странице
.swf-файл загруженный с другого домена (даже с разрешением) не имеет доступ к HTML-окружению на вашей странице. Для этого ему нужно разрешение. Только на этот раз, вы выдаете его сами.
При вставке .swf-файла на страницу необходимо указать параметр AllowScriptAccessс соответствующим параметром:
always - Разрешает доступ всем .swf-файлам
sameDomain - Разрешает доступ .swf-файлами, загруженным с того же домена, что и страница
Внимание: Учтите, когда вы открываете доступ к HTML-окружению .swf-файлам с неизвестных вам доменов, вы подвергаете всю безопасность на вашей страницы.
Дополнительный материал для изучения
Для более детального ознакомления со всеми правилами безопасности Flash Player, вы можете заглянуть официальную справку на русском языке в раздел "Безопасность проигрывателя Flash Player".
Также смотрите спецификацию по файлу crossdomain.xml
Ровно неделю назад я со своим коллегой Виталием приехали с Челябинска, куда ездил на очередной RAFPUG проводимый компанией iHeroes. Написать отчет о поездке сразу не получилось, как всегда было много работы. И сегодня таки появилось несколько свободных минут.
Прямых поездов или самолетов на 19-20 ноября из Казани в Челябинск не оказалось. Решено было ехать на машине. 1000 км туда - 1000 км обратно. Поэтому поездку можно даже назвать маленьким путешествием :)
Приехали мы в Челябинск с опозданием, минут на 40 и все-таки успели на первый доклад.
Первым выступал Роман Куликов, он представлял своё издательство i-Jet Media.
Доклад получился очень насыщенным и интересным. Например было интересно узнать, что:
Cредняя продолжительность игрового проекта в социальных сетях - это около 6 месяцев.
Азиаты - одни из самых платежеспособных наций.
И многое другое...
Следующим выступал Илья Алябушев из компании Flexis.
Его доклад был посвящен методу организации работы с помощью технологии Scrum. Доклад получился больше технический, с кучей новых терминов и непонятных слов :) Тем не менее у Ильи получилось в общих чертах истолковать идею Scrum, за что ему огромное спасибо.
Следующей темой собрания была «Инди-разработка». Ею с нами поделился Алексей Давыдов из компании Flazm.
Он повествовал, что же это такое «инди». Немного запутал конечно, но суть ясна: "Инди-разработчик - это тот, который работает только на себя" :) Рассказал о плюсах и минусах этого направления. В общем было что послушать.
Следующей вышла Анна Сенина, организатор встречи и представитель компании iHeroes.
Анна рассказала о том:
что такое Аква3D, над которым они работают уже около года,
как устроена организация работы в их команде,
как они используют для этого Scrum, о котором рассказывал Илья Алябушев.
Ну и самый ожидаемый доклад Антона Волкова - отца 3D-движка Alternativa3D.
Лет пять назад, изучая Flash мне часто попадались его исходники, и именно его доклад вызывал у меня больший интерес. Мне хотелось увидеть его живьем :) Кстати когда я зашел в зал из AlternativaPlatform я узнал только Александра Карповича, и в какой-то момент даже испугался что Волкова сегодня не будет. Но мои сомнения развеялись, чуть позже Антон приехал вместе с Владимиром Бабушкиным.
Доклад Антона получился конкретно по делу, ничего лишнего. Он рассказал о том как становилась компания AlternativaPlatform, как развивалось 3D во FlashPlayer, как они попали на Adobe Max, какое они имеют отношению к новому плееру под кодовым именем "Molehill", как придется работать с 3D API во нем, когда он будет доступен в релизе. Показал готовые демки на новом плеере, а также повествовал о планах компании. В общем рассказал всё, что было интересно публике.
Из его доклада я выдели две важные вещи:
Ожидать новый плеер в бете можно весной 2011 года, в релизе - не раньше лета 2012.
Сейчас можно без опасений на будущее использовать 7 версию движка, т.к. AlternativaPlatform обещают безболезненный переход на 8 версию.
После доклада Антона, нам пришлось уехать чтобы успеть на ночлег в Уфе. И мы пропустили доклад Владимира Бабушкина с Евгением Сушковым и блиц-доклад Максима Фирсова, а также выпивания в ближайшем кафе, о чем сильно жалеем :(
Кстати еще больше мы пожалели об этом, когда выехали из Челябинска и уже спустя час на трассе началась настоящая пурга. Дорога превратилась каток, дальше пяти метров ничего не видно. Плюс сотрудники гибдд перекрывают трассу, до приезда дорожных служб. В какой-то момент даже приходила мысль переночевать в машине на обочине. Но спустя пару часов, мы дождались дорожную службу, которая полила дорогу специальным составом и легковые машины пустили. Так при скорости 30-60 км./ч. часов за шесть часов мы все-таки добрались до окрестностей Уфы. Переночевали, и снова в дорогу :) Вечером были в Казани.
Также смотрите отчет и фотки от Анны Сениной. Организаторам встречи огромное спасибо :)
FireFlash - это плагин для FireBug'а, с помощью которого можно легко и удобно отлаживать свои приложения.
Что такое FireBug?
FireBug - это расширение для браузера Mozilla Firefox. Используется он для отладки web-приложений и пожалуй является самым сильным инструментом в этой области. Попробовав раз, отказаться от него уже не сможешь :)
Что умеет FireFlash?
FireFlash предоставляет .swf-файлам на странице доступ к консоли FireBug'a. С возможностями добавлять в консоль и окно Output используемого редактора ActionScript 3.0 записи разных типов:
Записи журнала
Информационные сообщения
Сообщения об опасности
Деревья объектов
...
Как установить FireFlash?
Первым делом нужно установить Mozilla Firefox, если такого не имеется. Скачать его можно с официального сайта http://www.mozilla.com/.
Во-вторых, нужно поставить плагин FireBug не ниже версии 1.4.5. Установить его можно на соответствующей странице https://addons.mozilla.org/en-US/firefox/addon/1843/. После установки в правом нижнем углу браузера появится соответствующая иконка для открытия окна FireBug'a.
В-третьих нужно поставить сам FireFlash. Сделать это можно также со страницы дополнений к Mozilla Firefox по адресу https://addons.mozilla.org/en-US/firefox/addon/55979/. В правом верхнем углу содержимого FireBug'a вы увидите вот такую иконку.
Как обращаться к FireFlash из ActionScript 3.0?
Для этого имеется библиотека классов com.actionscript_flash_guru.* В ней имеется единственный необходимый нам класс com.actionscript_flash_guru.fireflashlite.Console.as, который содержит в себе различные методы для работы с FireFlash. Скачать архив с библиотекой можно с официальной страницы. А также можно подписаться на уведомления об обновлении библиотеки в Twitter.
А можно по-подробнее?
/**
*
*//**
* Блокирует вывод сообщений в окно Output внутри используемого FrameWork
* Другими словами класс консоли не регистриует свои сообщения при помощи фунции trace();
*/Console.disableIdeTrace();/**
*
*//**
* Метод выводит в консоли FireBug'a содержимое объекта в виде дерева,
* а также дублирует его в окне Output
*
* @param Ссылка на объект
* @param Количество вложенностей дерева
* @param Сопутствующее сообщений
*/Console.dir(obj, 3, "Custom message");/**
*
*//**
* Метод выводит в консоли FireBug'a содержимое xml-строки,
* а также дублирует его в окне Output
*
* @param Строка xml-узла
* @param Сопутствующее сообщений
*/Console.dirxml(xml, "Custom message");/**
*
*//**
* Метод выводит в окно Output сообщение с меткой ошибки,
* ссылкой на класс и метод инициализировавший ошибку
*
* @param Строка с сообщением об ошибке
*/Console.error("Error message");/**
*
*//**
* Метод созает таймер с заданным идентификатором и начинает отсчет.
* Для того чтобы, остановить таймер необходимо
* использовать метод timeEnd();
*
* @param Идентификатор таймера
*/Console.time("your_id");/**
*
*//**
* Метод останавливает таймер c заданым идентификатором.
* Выводит информационное сообщение в консоль FireBug'a
* с указанием имени .swf-файла, идентикатора таймера и его значения.
* А также дублирует сообщение в окно Output с соответвующей меткой
*/Console.timeEnd("your_id");/**
*
*//**
* Метод проверяет условие, и если оно ложное
* выводит указанное сообщение в окно Output
*
* @param Условие
* @param Сообщение для ложного значения
*/Console.assert(false, "Messages for the false values");/**
*
*//**
* Метод выводит в окно Output сообщение с
* ссылкой на класс и метод инициализировавший вызов
*
* @param Строка с сообщением об ошибке
*/Console.stackTrace();/**
*
*//**
* Метод выводит простое сообщение в консоль FireBug'a,
* а также дублирует его в окно Output с соответствующей меткой
*
* @param Текстовое сообщение
*/Console.log("Simple message");/**
*
*//**
* Метод выводит информационное сообщение в консоль
* FireBug'a с соответствующей иконкой, а также дублирует
* его в окно Output с соответствующей меткой
*
* @param Информационное сообщение
*/Console.info("Information message");/**
*
*//**
* Метод выводит сообщение об опасности в консоль
* FireBug'a с соответствующей иконкой, а также дублирует
* его в окно Output с соответствующей меткой
*
* @param Cообщение об опасности
*/Console.warn("Warning message!");/**
*
*//**
* Метод дублирует поведение метода log();
*/Console.debug("Simple message");/**
*
*//**
* Метод добавляет в консоли FireBug'а блок для группы
* с заданным названием, а также дублирует соответсвующую
* запись в окне Output
*
* @param Названия для группы
*/Console.group("Group name");/**
*
*//**
* Метод дублирует поведение метода Console.group();
* только блок будет иметь закрытое состояние
*/Console.groupCollapsed("Group name");/**
*
*//**
* Метод закрывает блок, открытый ранее
* Используется только после вызова методов
* Console.group(); и Console.groupCollapsed();
*/Console.groupEnd();
А как-же пример?
Откройте консоль FireBug'a и понажимайте на кнопки из примера. Вы должны увидеть результат примеров.
Огромное спасибо за новый инструмент Nicholas Dunbar, надеюсь его работа прижевется в руках разработчиков ActionScript-приложений. А также спасибо Flastar'у за информацию о существовании инструмента.
24 сентября 2010 года на сайте лаборатории Adobe обновился проект "Squiggly". Обновили проект до 4-ой пререлизной версии. О нем я услышал впервые, и очень им заинтересовался. Теперь хочу подделиться с вами.
Что такое проект "Squiggly"?
Это набор .swc-библиотек для работы с орфографией во Flash, Flex и AIR проектах. Название переводится как "волнистые" с намеком на то, что неправильные слова подчеркиваются именно этой линией.
Что он дает?
Возможности анализа текста в ActionScript 3.0.
Какие возможности?
Проверка орфографии и правил языка, варианты исправления неправильных слов.
Это означает, что нам можно использовать уже готовые словари из других программ, основанных на этой же основе. Таких как: OpenOffice, Mozilla FireFox, Opera и многих других. Например, словари от Mozill'ы можно найти здесь. Но прежде чем использовать словари сторонних программ, пожалуйста ознакомьтесь с лицензионными соглашениями.
Как это работает?
Рассмотрим по-подробнее чистый ActionScript 3.0 проект. Загружаем архив с библиотеками. Нам понадобиться только одна из них: AdobeSpellingEngine.swc (Остальные предназначены для Flex-проектов). Подключаем её у нашему проекту.
Первым делом нужно загрузить словари с орфографией и правилами.
//// Создаем экземпляр словаря
dictionary = new HunSpellDictionary();
//// Добавляем обработчик события загрузки библиотек
dictionary.addEventListener(Event.COMPLETE, onDictanionaryComplete, false, 0, true);
//// Грузим библиотеки
dictionary.load("dictionaries/en_US/en_US.aff", "dictionaries/en_US/en_US.dic");
После того, как словари загружены, в обработчике нужно создать объект который будет проверять орфографию слов.
/**
* Метод обрабатывает событие успешной загрузки библиотек для словаря
* Создает экземпляр объекта для проверки слов
*/private function onDictanionaryComplete (e:Event):void
{
//// Создаем экземпляр объекта для проверки слов, в параметре указываем ссылку на словарь
spell_checker = new SpellChecker(dictionary);
}
Чтобы проверить какое-то слов нужно вызвать у проверяющего объекта метод checkWord();
spell_checker.checkWord("heloo");
Чтобы получить список возможных исправлений для слова имеется метод getSuggestions();
spell_checker.getSuggestions("heloo");
А как проверить содержимое текстового поля и подчеркнуть неправильные слова?
Алгоритм примерно такой:
Разбиваем строку содержимого на список слов (В элементах списка нужно иметь значение слова, индекс первого символа и последнего).
За несколько дней до выхода последней на текущий момент среды разработки Flash-приложений Adobe Flash CS5, компания Apple выпустила запрет на разработку приложений для телефонов iPhone, используя сторонние технологии. А это означало то, что самая ожидаемая возможность новой платформы - портирование Flash-приложений на iOS (операционная система телефонов iPhone и планшетов iPad) использоваться не может. Для сообщества Flash-разработчиков это было настоящим ударом. Вокруг того события было много шума и обсуждений...
Adobe ничего не оставалось и пришлось смириться с этим. Они заявили, что прекращают все инвестиции в разработку Packager for iPhone и сконцентрируют своё внимание на мобильной платформе Android. Кстати у них это неплохо получилось: AIR и FlashPlayer уже есть на Android.
9 сентября 2010 года компания Apple заявляет об отмене ограничений на разработку приложений для iOS используя сторонние технологии. Для разработчиков Flash-платформы это стало радостной новостью. Adobe видимо тоже это обрадовало, и на забытой странице Packager for iPhone появилось специальное сообщение от 9 сентября о том, что Adobe возобнавляет работы над проектом Packager for iPhone. Я попробовал перевести его:
Недавнее заявление Apple о том, что он снял ограничения на принципы разработки третьими сторонами имеет прямые последствия для Packager для iPhone. Функция доступна для использования разработчиками уже сегодня и сейчас мы возобновим работу по развитию этой функции в будущих выпусках. Это отличная новость для разработчиков, и мы слышим от них, что новые приложения AIR для устройств iOS уже утверждены на Apple App Store. Мы хотим отметить, что ограничения на работу Flash содержимого в браузерах iOS устройств остается в силе.
Packager for iPhone
Из названия видно, что это упаковщик. Что же именно он упаковывает? А упаковывает он AIR-приложения. Т.е. мы будем разрабатывать AIR-приложения, после чего портировать их в родные для iOS инсталяторы приложения IPA файлы. Естественно нам будут доступны не все возмодности AIR. Именно поэтому Adobe собрал отдельную версию AIR SDK и назвал её «Packager for iPhone», который также умеет конвертировать приложения AIR в IPA.
Использование упаковщика доступно нам в двух вариантах:
Встроенные функции во Flash CS5
Отлельная библиотека AIR SDK
В данном посте я хочу показать пример разработки AIR-приложений для iPhone, используя FlashDevelop совместно с AIR SDK.
Настроим FlashDevelop
О том, что такое FlashDevelop, как его установить и настроить, я говорить не буду. Если у вас его еще нету, то смотрите пост "FlashDevelop: установка и настройка". Кроме того, во избежания ошибок компилятора, советую обновить Flex SDK до версии 4.0.1. Найти последнюю версию сборки можно на сайте проекта.
Первым делом нужно скачать Packager for iPhone. Ссылку можно найти на официальной странице проекта. После загрузки нужно распаковать данный архив в постоянную директорию. Например у меня он лежит по адресу: C:\Program Files\Adobe\Adobe Packager for iPhone
Теперь открываем FlashDevelop и в Tools > Custom Arguments... заводим новый аргумент с именем PackagerForiPhonePath. В значении указываем выше выбранный путь до библиотеки нашего упаковщика.
Загружаем подготовленный мной образ проекта. Кладем его в Tools > Application Data... > Projects. Если всё сделано правильно, должен появиться новый типа проекта "Packager for iPhone Projector"
Это и есть наш проект для разработки AIR-приложений, которые впоследствии можно будет портировать в IPA-файлы. В следующих постах я буду обновлять образ проекта. На данный момент он имеет только те функции, которые необходимы в рамках данного поста.
Создадим новый проект
Идем в Project > New Project, называем наш проект "My first application for iPhone", выбираем тип проекта "Packager for iPhone Projector", жмем "OK". Получаем новый проект.
Сразу пробуем. Нажимаем F5. И видим окно нашего приложения с размерами для iPhone.
Здесь мы можем даже проэмулировать поворот девайса. Для этого выбираем Device > Rotate Left или Rotate Right. Окно приложения изменит размеры соотвественно.
Теперь подробнее расмотрим файлы проекта.
Так как это AIR-приложение мы имеем всё тоже что и в обычном AIR-проекте. Остановимся только на application.xml. Он имеет небольшие дополнения к стандартным дескрипторам.
<?xml version='1.0' encoding='UTF-8'?>
<application xmlns='http://ns.adobe.com/air/application/2.0'>
<!-- -->
<!-- The application ID uniquely identifies your application.
The recommended form is a dot-delimited,
reverse-DNS-style string, such as'com.company.AppName'.
The compiler uses thisvalueas the bundle ID for the iPhone application. -->
<id>TestProject</id>
<!-- -->
<!-- The name used for the iPhone installer file.
Do not include a plus sign (+) character in the filename. -->
<filename>TestProject</filename>
<!-- -->
<!-- The name of the application displayed in the iTunes application and in the iPhone.
Do not include a plus sign (+) character in the name -->
<name>Test Project</name>
<!-- -->
<!-- Helps users to determine which version of your application they are installing.
The version is used as the CFBundleVersion of the iPhone application.
It must be in a format similar to nnnnn[.nn[.nn]]
where n is a digit 0-9 and brackets indicate optional components,
such as1, 1.0, or 1.0.1. iPhone versions must contain only digits and decimal points.
iPhone versions can contain up to two decimal points. -->
<version>1.0</version>
<!-- -->
<!-- The element contains the following child elements to specify the properties
for of the initial appearance of the application -->
<initialWindow>
<!-- -->
<!-- The rendering mode used by the application. There are three possible settings:
- cpu—The application uses the CPU to render all display objects.
No hardware acceleration is used.
- gpu—The application uses the iPhone GPU to composite bitmaps.
- auto—This feature has not been implemented. -->
<renderMode>gpu</renderMode>
<!-- -->
<!-- Identifies the root SWF file to compile into the iPhone application -->
<content>TestProject.swf</content>
<!-- -->
<!-- Specifies that the application uses the entire screen of the iPhone -->
<fullScreen>false</fullScreen>
<!-- -->
<!-- Specifies that the initial aspect ratio of the application
isin portrait mode (rather than landscape).
Note the Default.png file used to define the initial window of the application
should be 320 pixels wide and 480 pixels high,
regardless of this setting. -->
<aspectRatio>portrait</aspectRatio>
<!-- -->
<!-- Specifies whether the orientation of content in the application automatically
reorients as the device itself changes physical orientation -->
<autoOrients>true</autoOrients>
</initialWindow>
</application>
На данный момент в нем не полный список дескрипторов, а только необходимый для разработки и отладки.
Упаковка IPA-файлов - это отдельная задача, которая требует реального устройства и получения сертификатов от Apple. Поэтому я отпущу пока эту тему. Как только у меня будет весь необходимый материал, я обязательно опишу по шагам всё решение этой задачи.
О чем еще стоит сказать
А сказать еще стоит о многом. Так как тема новая и не достаточно изученная, материала много. И рамках одного поста рассказать обо всем не получится. Пока только могу предложить пищу для размышлений, которую мы разберем позже:
Какие классы можно использовать в AIR-приложениях для iPhone, а какие нельзя