Глава 14. Развёртывание приложений
Сборка и развёртывание мобильного приложения на ваших устройствах — это только начало. Для успеха приложения требуется гораздо больше. В этой главе мы сосредоточимся на всех деталях развёртывания приложений.
В этой главе будут рассмотрены следующие темы:
- Развёртывание в магазины приложений
- Монетизация с помощью рекламы и внутриигровых покупок
- Советы по автоматизации процесса разработки
Цель этой главы — научиться успешно развёртывать и поддерживать мобильные приложения для iOS и Android.
Технические требования
С точки зрения кода эта глава немного отличается. В исходном коде книги нет соответствующего кода. Для этой главы исходный код приложения MyMoleculeHero управляется отдельно от исходного кода книги и доступен по адресу: https://github.com/marcocantu/MyMoleculeHero.
Развёртывание в магазины приложений
Вы собрали приложение и протестировали его на множестве различных устройств с разными версиями поддерживаемых мобильных операционных систем, и теперь чувствуете, что готовы опубликовать его в магазине приложений.
В качестве примера мы будем использовать обновлённую версию демо-приложения MyMoleculeHero, которое написал и опубликовал Павел. Это приложение представляет собой 3D-просмотрщик химических молекул, который читает данные в формате Protein Data Bank (PDB) и генерирует модели из сфер и цилиндров. Результат работы этого приложения можно увидеть на рисунке 14.1.
Новая версия приложения называется MyMoleculeHero. Оно имеет открытый исходный код с лицензией MIT и полностью бесплатно для использования и модификации кем угодно. Вы можете найти его по адресу github.com/marcocantu/MyMoleculeHero, а оригинальная версия по-прежнему доступна по адресу github.com/pglowack/MoleculeHero.
Графика приложений
Прежде чем собирать приложение для развёртывания в магазине, необходимо добавить в проект требуемую графику. Это набор изображений в формате PNG, которые используются как значки приложения, заставки и значки для поиска Spotlight. При создании нового мультиплатформенного приложения в Delphi используется значок FireMonkey по умолчанию, который можно найти в стандартной установке Delphi в каталоге bin\artwork.
Все необходимые графические файлы можно настроить на вкладке Application Icons в диалоговом окне Project Options. Начиная с 12-й версии Delphi, значки и заставки для разных разрешений могут генерироваться автоматически с помощью мастера Artwork Generator. Чтобы активировать мастер для всех платформ, следует выбрать опцию All configuration – All platforms в комбинированном списке целей (см. рисунок 14.2) перед запуском мастера.
После запуска мастера Artwork Generator первая ключевая информация, которую нужно указать, — это исходное изображение, которое, как я уже упоминал, по возможности должно быть SVG-файлом, хотя поддерживаются и PNG-файлы. Начальную конфигурацию мастера можно увидеть на рисунке 14.3.
Продвигаясь дальше по этому мастеру, на второй странице вы найдёте дополнительную настройку для Android Adaptive Icon. На следующей странице предлагается конфигурация для Splash Screens. После нажатия кнопки Finish мастер сгенерирует пару десятков различных графических файлов и настроит их непосредственно в параметрах проекта.
Ориентация приложений
Ещё одна важная настройка перед развёртыванием приложения — его ориентация. Её можно указать на вкладке Orientation в диалоговом окне Project Options. По умолчанию она не включена, и при повороте физического устройства форма вашего приложения также будет поворачиваться, адаптируясь к текущей ориентации и вызывая событие OnFormResize.
Публикация в Apple iOS App Store
Первым шагом к публикации приложения в iOS App Store является создание учётной записи разработчика на сайте developer.apple.com. Учётная запись разработчика Apple требует оплаты, которую необходимо продлевать каждый год.
Чтобы отправить приложение в iOS App Store, нужно создать запись для своего приложения на сайте разработчика Apple, создав конфигурацию ID приложения (bundle ID). Далее необходимо создать и загрузить Provisioning Profile.
Откройте диалоговое окно Project Options для своего приложения и в верхней части диалога выберите All Configurations - iOS Device - 64 bit в качестве цели.
Перейдите на вкладку Version Info и убедитесь, что CFBundleIdentifier совпадает с Bundle ID, который вы создали на сайте разработчика Apple. В случае с MyMoleculeHero это будет com.marcocantu.MyMoleculeHero.
В Project Manager убедитесь, что выбрана конфигурация сборки Release, а в разделе Configuration цели iOS 64-bit дважды щёлкните по узлу Application Store, чтобы сделать его активным, как показано на рисунке 14.4.
Убедитесь, что на вашем Mac запущен сервер Platform Assistant (PAServer). Далее проверьте, что у вас есть правильный Provisioning Profile для развёртывания в App Store. Если перейти на страницу Deployment в параметрах проекта, Delphi получит информацию с вашего Mac через PAServer, как показано на рисунке 14.5.
Теперь щёлкните правой кнопкой мыши по узлу проекта в Project Manager и выберите Build из контекстного меню. Откройте окно Deployment Manager и нажмите кнопку Deploy. Если всё настроено правильно, вы должны найти файл .ipa в папке Release вашего проекта.
Чтобы отправить своё iOS-приложение, не используя Xcode, можно использовать приложение Transporter от Apple, свободно доступное для macOS. Вернувшись на сайт App Store Connect, теперь можно создать отправку, настроить описание, цены, политики конфиденциальности и многое другое. Описание приложения в Apple App Store можно увидеть на рисунке 14.6.
Публикация Android-приложений в Google Play Store
Аналогично iOS-версии, первым шагом для публикации вашего Delphi-приложения для Android является создание учётной записи разработчика Google Play на сайте developer.android.com. Это также платная учётная запись, но вы делаете разовый платёж, а не ежегодный.
С этого сайта нужно перейти в консоль Google Play по адресу play.google.com/console для управления своими приложениями.
На вкладке Uses Permissions в диалоговом окне Project Options проверьте, выбраны ли все необходимые права, которые потребуются вашему приложению.
Для подписи приложения для Android необходимо настроить KeyStore File на вкладке Provisioning в диалоговом окне Project Options. Если у вас его нет, можно создать, нажав кнопку New Keystore и следуя шагам мастера. Получив файл, можно ввести соответствующий пароль и увидеть его данные в IDE Delphi, как показано на рисунке 14.7.
Вторая специфическая конфигурация в Project Options находится в одном из разделов Delphi Compiler и указывает, что вы хотите создать файл развёртывания, включающий как 64-битную, так и 32-битную версии приложения в одном пакете. Эту конфигурацию можно увидеть на рисунке 14.8.
Не забудьте также дать приложению правильное внутреннее имя. Например, в поле package на странице Version Info можно удалить домен com.embarcadero и использовать либо полное имя, либо имя на основе вашей собственной идентичности. В моём случае я использую:
com.marcocantu.$(ModuleName)
Перейдите в Project Manager и выберите конфигурацию сборки Release и конфигурацию Application Store в узле цели Android. В меню Project щёлкните по Build, а затем по Deploy. Это должно создать подписанный файл .aab, готовый для отправки в Google Play Store.
Чтобы отправить своё приложение, нужно войти в консоль Google Play Developer и выбрать Add new application. Выберите язык приложения по умолчанию и введите название приложения, как показано на рисунке 14.9.
После загрузки файла информация, извлечённая из вашего .aab-файла, будет отображена на странице конфигурации приложения. Необходимо заполнить обязательную информацию на оставшихся вкладках, отмеченных звёздочками, а затем нажать Save.
Монетизация с помощью рекламы и внутриигровых покупок
Существуют различные бизнес-модели для мобильных приложений. Вместо того чтобы ожидать, что пользователи заплатят за приложение до его использования, довольно часто предлагается использовать приложения бесплатно. В этом случае можно монетизировать свои приложения, показывая рекламу или предлагая внутриигровые покупки.
Delphi поставляется с кроссплатформенным компонентом TInAppPurchase, доступным на вкладке Services в палитре инструментов. С помощью этого компонента можно продавать виртуальный контент внутри приложения единым способом, используя службу выставления счетов Google Play для внутриигровых покупок на Android и службу внутриигровых покупок Apple iOS на iOS.
Ещё одна возможная бизнес-модель — встраивание рекламы в ваши приложения. FireMonkey поставляется с компонентом TBannerAd, который можно использовать для простого отображения рекламы в приложении. Реклама обычно настраивается в коде путём написания чего-то подобного:
BannerAd1.AdUnitID := 'ca-app-pub-1234567890';
BannerAd1.LoadAd;
FireMonkey предлагает платформенно-ориентированную рекламу для iOS (функция, от которой Apple отказалась) и Android, а также Google Firebase Ads для обеих платформ — iOS и Android.
Автоматизация процесса разработки
Первый релиз приложения вряд ли будет последним. Это приводит нас к вопросу — как можно продолжать создавать и улучшать своё приложение? IDE Delphi предоставляет множество функций, которые помогают установить собственные автоматизированные рабочие процессы, включая движок управления версиями, редактирование кода, рефакторинг, интегрированное модульное тестирование и настраиваемые события сборки.
Версионирование приложений
Чтобы иметь возможность отслеживать ошибки и понимать, какую версию приложения используют клиенты, важно, чтобы каждое приложение имело хорошую стратегию версионирования. Страница Delphi Project Options позволяет установить номер версии, используя номера major, minor и build, как видно на рисунке 14.10.
Android Play Store внутренне использует единый номер релиза, увеличиваемый каждый раз для каждой версии, хотя пользователям может отображаться версия, состоящая из нескольких чисел. С другой стороны, iOS использует номера major и minor версий.
На протяжении своей работы разработчиком приложений я принял интересное решение. Я использовал постоянно увеличивающийся номер build, а не сбрасывал его при увеличении major-версии, и использовал его как номер пакета Android. Например, предположим, что я на сборке 1.1.8. Она будет отображаться как версия 1.1 и внутренне использовать число 8. Следующая версия может быть 1.2.9, отображаемая как версия 1.2 с внутренним номером пакета Android 9. Следующий большой релиз может быть 2.0, но я всё равно увеличу номер build, так что теперь это 2.0.10, отображается как 2.0 для пользователей и внутренне как версия 10.
Практическое управление версиями
IDE Delphi поставляется с интегрированной, лёгкой системой управления версиями. В нижней части редактора кода есть вкладка History. Каждый раз, когда в вашем коде происходят изменения и вы сохраняете код, новая копия вашего файла создаётся в скрытой подпапке __history. В Editor Options, в глобальном диалоговом окне Tools Options, можно управлять тем, сколько последних версий каждого файла хранится, используя настройку File backup limit. По умолчанию это значение равно 10, но его можно увеличить до 90.
Поверх встроенного управления версиями также можно настроить Delphi для интеграции с некоторыми популярными системами управления версиями, включая Git и Subversion. История вашего приложения, в самом деле, будет учитывать версии файлов, зафиксированные в системах управления версиями, и локальные файлы резервных копий. Пример показан на рисунке 14.11.
Спокойный сон благодаря модульному тестированию
Написание кода похоже на решение большой головоломки. Чем больше строк кода в вашем приложении, тем сложнее его поддерживать и развивать. Модульное тестирование может помочь убедиться, что каждая часть написанного вами кода работает так, как ожидается.
IDE Delphi поставляется с двумя интегрированными фреймворками модульного тестирования: DUnit и DUnitX. DUnitX новее и использует современные языковые возможности, такие как пользовательские атрибуты. Delphi интегрирует мастер для создания модульных тестов DUnitX для приложения (см. рисунок 14.12), предлагая возможность заполнить наборы тестов начальным набором скелетов тестов.
После подготовки тестов их можно и нужно запускать при каждом изменении, которое вы вносите в код. Убедитесь, что тесты всегда остаются зелёными.
Заключение
Теперь ваше приложение находится в магазине приложений, и вы стали разработчиком, способным написать код один раз и скомпилировать его нативно для всех основных мобильных и настольных платформ из одних и тех же файлов исходного кода. Никто не может превзойти вашу продуктивность.
В этой главе мы прошли по шагам, необходимым для подготовки и публикации ваших Delphi-приложений в основных магазинах приложений. Мы осознали, что нахождение в магазине приложений не означает конец жизни вашего приложения. Мы также представили критически важные методы, которыми вы должны овладеть, чтобы поддерживать ваше приложение в здоровом состоянии со временем.
Это почти конец книги. Есть ещё одна глава, которая предлагает некоторые дополнительные рекомендации о том, на чём можно сосредоточиться дальше после окончания чтения книги.