Pull to refresh

Особенности выпуска Unreal Engine 4 игры на iOS

Reading time13 min
Views8.8K
Приветствую.

В этой статье я перечислю трудности и неочевидные моменты, с которыми лично я столкнулся при выпуске игры на iOS, а также их решения.

Игра начинала создаваться на Unreal Engine 4.18, сейчас последний билд в магазине использует UE 4.24. Сначала игра была выпущена на Android, после я занялся выпуском ее на iOS.

image

Кому может быть интересна статья:

  • разработчикам игр на UE 4, которые решат выложить свой труд в App Store.
  • разработчикам приложений для iOS (некоторые части статьи повествуют только об экосистеме Apple без привязки к UE 4).


Дисклеймер:
  • много текста.
  • в посте будут ссылки на сторонние ресурсы — это не реклама, это то, что именно мне помогло.
  • со временем что-то из описанного может потерять актуальность.
  • некоторые моменты для кого-то могут показаться наивными или глупыми, но это мой путь разработки.


Спойлер
51 день прошел от момента, как я приступил к сборке под iOS, до получения счастливого письма с темой «The status of your app, Sokopango, is now „Ready for Sale“.». Последние 40 минут которых прошли между отправкой приложения на проверку и его успешным прохождением.


1. Первые шаги в App Store Connect


1.1 Подтверждение личности в Apple Developer Program


После оплаты членства (регистрация/вступление в Apple Developer Program) виртуальной картой (эта та, где при платеже через интернет вместо моих ФИО мне надо указывать «DIGITAL CARD» — это у моего банка, у вас может быть указан другой держатель карты), мне нужно было подтвердить личность, т.к. данные моего аккаунта не совпадали с данными держателя карты.
Вот часть текста письма от проверяющего мою регистрацию:

To proceed with your Apple Developer Program enrollment, we must verify the identity of the developer who will be using the account.

Please upload a copy of the developer’s photo ID. The ID must meet verification requirements for your region:

  • Government-issued passport
  • Valid (not expired)
  • Includes the name in Roman characters*

* If the ID does not include a romanized name, you must also upload a solicitor-certified English translation.
...

Мне повезло, что у меня был действующий заграничный паспорт. Сделал его скан и отправил в ответе на письмо. В тот же день я присоединился к Apple Developer Program.

Поэтому, если будете оплачивать взнос с карты, данные о держателе которой отличаются от ваших ФИО, будьте готовы подтвердить личность разработчика.

1.2 Подтверждение платежных данных


Если приложение будет приносить прибыль (оно платное, или есть встроенные покупки), необходимо указать платежные данные в своем профиле.

Идем:

  • App Store Connect.
  • Соглашения, налоги и банковские операции.
  • Заходим в «Платные приложения».
  • Заполняем необходимы данные. Это будет контактная информация, налоговая форма и указание валютного банковского счета. В налоговой форме в «Type of Beneficial Owner» я указал «Individual/Sole proprietor», поэтому везде указывал свои личные данные (ФИО и номер телефона), также указал валютный счет, который я открыл в личном кабинете банка за минуту.
  • Отправляем на проверку, ждем подтверждения и заветного статуса «Активно».

Также об этом можно почитать в Workflow for configuring in-app purchases.

1.3 Видео для предпросмотра приложения


В настройках страницы приложения помимо скриншотов можно загрузить еще видео. В Google Play просто вставляется ссылка на видео из YouTube. В App Store по-другому, цитата:
Чтобы загрузить видео для предпросмотра приложения, необходимо использовать Safari и OS X версии 10.10 и новее.
Как оказалось, картинки можно загружать с любого браузера любой ОС, а видео только из Safari, который есть только в MacOS.

У меня уже был готовое видео, но оно не подходило по размеру сторон.

Краткая спецификация по видео (тексты ошибок в App Store Connect при неудачной загрузке видео):
  • iPhone 6,5-дюймовый дисплей — «App preview dimensions should be: 1920x886, 886x1920.».
  • iPhone 5,5‑дюймовый дисплей — «App preview dimensions should be: 1920x1080, 1080x1920.».
  • iPad Pro (3-го поколения) 12,9-дюймовый дисплей — «App preview dimensions should be: 1600x1200, 1200x1600.».
  • iPad Pro (2-го поколения) 12,9‑дюймовый дисплей — «App preview dimensions should be: 1200x900, 900x1200, 1600x1200, 1200x1600.».
Здесь можно посмотреть спецификацию к видеопревью приложения.

В спецификации гораздо больше перечислено разрешений для разных устройств. Для моей страницы хватило 4-х видео с разрешениями из списка выше.

Новое видео я делать не хотел, надо было отредактировать существующее. Чтобы изменить разрешение, в интернете нашел первый попавшийся сайт по изменению размера видео. Разрешение поменял путем добавления черных полос к картинке. Для меня это было приемлемо.

Еще у меня ролик был длиннее 30 секунд (это максимум для превью), поэтому его пришлось чуть обрезать.

Так же сделал это первым попавшимся онлайн-редактором.

1.4 Прочее


  • Удивило, что нет категории игр Аркады.
  • В покупках нельзя поставить произвольную цену, в отличие от Google Play.

2. Сборка проекта


2.1 Настройка проекта


Вся информация есть в документации. Отдельно смотрел настройки (папки "Build" и "Config", и файлы "ProjectName.Target.cs", "ProjectName.Build.cs") в шаблонных проектах ActionRPG и UnrealMatch3 — многое взял оттуда.

Обязательно надо иметь хотя бы 1 сертификат, профайл и идентификатор (App ID / Bundle ID) для того, чтобы собрать и выложить приложение в App Store.

У меня было/есть:

  • 2 сертификата — для магазина (тип «iOS Distribution» — сборка с этим сертификатом будет загружаться в App Store Connect) и для тестирования (тип «iOS Development» — когда напрямую заливается приложение на iPhone через USB).
  • 1 идентификатор.
  • 2 устройства (мой и жены) — нужно только для тестирования при установке напрямую на телефон. UDID можно узнать в iTunes.
  • 2 профайла — также для магазина и тестирования (тут понадобится указать устройства, на которые можно будет установить приложение).

2.2 Если нет MacOS


Благодаря политики Apple, для сборки проекта под iOS нужна MacOS. У меня Windows, кросс-компиляцию, как для сборки под Linux, сделать нельзя.

Были тщетные попытки установить/запустить виртуальный образ MacOS на моем AMD Phenom.
Пришлось остановиться на аренде виртуальной машины. Я поискал и нашел данный сервис.

Регистрация и оплата совмещены, т.е. нельзя просто зарегистрировать, придется сразу платить (я такое увидел впервые). Купил тариф «macOS Mojave Cloud Basic» за 34.99 долларов в месяц. Сразу после регистрации/оплаты получил письмо с инструкцией и доступами.

Чтобы заходить на удаленный сервер, нужно будет поставить «NoMachine Enterprise Client».
Зашел, обновил ОС (была не самая последняя версия) и поставил Xcode.

2.3 Удаленная компиляция


VPS арендовал, проект настроил, Xcode поставил — пора собирать проект.

Но для начала надо настроить удаленную компиляцию, читаем документацию.

Так же нужно временно отключить имеющийся SSH-клиент, иначе при удаленной компиляции будет ошибка, связанная с rsync (текст ошибки не помню).

У меня Windows 10, я просто переименовал папку "C:\Windows\System32\OpenSSH".
После этого в терминале можно выполнить команду "where ssh.exe", чтобы проверить, что ОС не имеет доступных SSH-клиентов. Ответ у меня «ИНФОРМАЦИЯ: не удается найти файлы по заданным шаблонам.».

Помог пост.

В моём VPS SSH настраивать не надо было — все работало из коробки.

Не помню зачем я себе это сохранил, статья про настройку удаленной сборки проекта — вдруг кому пригодится.

2.4 Немного о сборке проекта


У меня сборка занимает в среднем от 20 до 50 минут. 20 минут, когда контент не менялся, но мог что-то в конфигах поправить.

А вот если было обновление движка, или что-то серьезно поменял в контенте, сборка может увеличиться. У меня увеличивалась в среднем до 50 минут.

При удаленной компиляции на VPS копируются исходники движка, проект, временные файлы и прочее. Лежит все это в "[Home]/UE4/".

В зависимости от настроек проекта, получаемый файл IPA может иметь разный размер.
На размер получаемого файла влияет только опция «Build Configuration» (Project Settings — Project — Packaging) — Development или Shipping.

Флаг «For Distribution», а также выбранный сертификат и профайл на размер не влияет.

Единственное, при установленном флаге «For Distribution» должен быть выбран Distribution сертификат и профайл, иначе проект не соберется.

Также при установленном флаге «For Distribution» к файлу добавляется префикс «Distro_», а при Shipping-сборке добавляется суффикс "-IOS-Shipping".

Для примера размеры моих сборок:

  • Development-сборка — 186 Мб.
  • Shipping-сборка — 491 Мб.

И тот и другой файл можно заливать на телефон по USB для тестирования.

Что касается большого файла, получаемого при Shipping-сборке, насколько я понял, он содержит ресурсы для разных устройств.

Вот какая информация отображается по этому файлу в App Store Connect:

image

2.5 Ошибки при сборке и их решения


2.5.1 Проблема с профайлами


Ошибка:
Provision not found. A provision is required for deploying your app to the device.
Signing key not found. The app could not be digitally signed, because the signing key is not configured.
...
Решение: удаление профайлов из каталог "C:\Users\[UserName]\AppData\Local\Apple Computer\MobileDevice\Provisioning Profiles" и повторное их импортирование в проект.

Ошибки, возможно, вылезали из-за того, что я профайлы и сертификаты импортировал и в настройках редактора, и через IPhonePackager.

В итоге их было несколько, хотя должно было быть по 2 шт.

2.5.2 Проблема с Xcode


Ошибка:
Invalid SDK MacOSX.sdk, not found in /Library/Developer/CommandLineTools/Platforms/MacOSX.platform/Developer/SDKs
Invalid SDK iPhoneOS.sdk, not found in /Library/Developer/CommandLineTools/Platforms/iPhoneOS.platform/Developer/SDKs

Решение: в терминале выполнить команду "sudo xcode-select -r".

2.5.3. Разные ошибки, связанные с rsync


Ошибки:
  • some files/attrs were not transferred (see previous errors) (code 23) at /home/lapo/packaging/rsync-3.0.4-1/src/rsync-3.0.4/main.c
  • rsync error: error in IPC code (code 14)
  • прочие
Решение: заново запустить сборку. У меня иногда 2-3 раза приходится ее заново запускать, чтобы проект собрался. Притом сборка прерваться может как в начале, так и ближе к концу.

2.5.4. Неудача при Development-сборки


Ошибка:
Provisioning profile «Development» doesn't match the entitlements file's value for the get-task-allow entitlement
Code signing is required for product type 'Application' in SDK 'iOS 12.2'

Решение: помог этот пост.
В списке идентификаторов зашел в нужный, поставил флаг на iCloud, сохранил.
Было сообщение, что профайлы станут невалидными — так и случилось.
Попытка сборки (для проверки) — ошибка. Так и должно быть.
Опять зашел в свой идентификатор, теперь снял флаг на iCloud, сохранил.
Сборка прошла успешно.

После пришлось удалять невалидные профайлы из проекта и делать новые. Либо можно попробовать зайти в профайл на сайте, сохранить его локально, и заново загрузить в проект.

2.5.5 Проблемы с сертификатом


Ошибка:
Ключ не может быть использован в указанном состоянии

Удалил сертификаты из настроек проекта, попробовал заново их добавить, при добавлении потребовался ввод пароля — ввел. Опять сборка с ошибкой, не помню какая.

Решение: удаление сертификатов (из хранилища сертификатов, см. п. 2.6.а) и профайлов (из каталога, см. п. 2.5.1), повторная генерация (по необходимости), импортирование в проект.

Что сделал я — вместо импортирования уже существующих сертификатов и профайлов, я заново все сгенерировал, а потом добавил в проект. При добавлении сертификатов пароль уже не требовался, а требовалось указать файл "*KeyPair.key".
После этого проект успешно собрался.

2.6 Немного о сертификатах


  1. Сертификаты хранятся в Личном хранилище Текущего Пользователя. Хранилище можно открыть через IE, либо через консоль оснастки, см. статью "Как просматривать сертификаты с помощью оснастки консоли MMC".
  2. Разработчик одновременно может иметь только 2 сертификата одного вида, и генерировать 2-3 в сутки, иначе будет ошибка «Maximum number of certificates generated». Чтобы можно было сгенерировать новые, нужно удалить неиспользуемые, либо подождать.

3 Тестирование собранной игры


3.1 Общее


Для тестирования на телефоне при установке приложения через USB нужно использовать Development сертификат и Development профайл с указанным UDID устройства.
Соответственно проект должен быть собран именно с этим сертификатом и профайлом. Как я писал выше, не имеет значения, какая опция выбрана в «Build Configuration» — Development или Shipping, но флаг «For Distribution» должен быть снят.

3.2 IPhonePackager


Приложение устанавливается через программу IPhonePackager (путь "[EnginePath]\Engine\Binaries\DotNET\IOS\IPhonePackager.exe").
При запуске откроется диалоговое окно выбора проекта, его нужно закрыть. В открывшейся программе нужно перейти на закладку «Advanced Tools» — нажать на кнопку «Install IPA to hardware ...» — выбрать ipa-файл — дождаться успешной установки.
У меня установка на телефон занимает от 20 до 80 секунд (в зависимости от размера файла и фазы луны).

У меня периодически не получалось установить приложение через IPhonePackager (актуально было до перехода на UE 4.24).

Ошибка (до UE 4.24): «Install \ Update of „FileName.ipa“ failed with Package Extraction Failed Error in ...»

Особенность ошибки в том, что либо зависает отправка файла (он отправляется частями), либо он ну очень быстро копируется на телефон (например, пол гигабайта за секунду).

Решение (не всегда работало): переподключить кабель к телефону, или воткнуть другой кабель, или перезагрузить телефон. Но иногда ничего из этого не помогало (хотя iTunes телефон видел), поэтому приходилось откладывать тестирование.

3.3 TestFlight


Также можно протестировать приложение через программу TestFlight. Тестирование закрытое, по приглашению.

В App Store Connect в разделе TestFlight:

  • в подразделе «Пользователи App Store Connect» добавляете себя.
  • в подразделе «Тестировщики и группы» добавляете группу тестировщиков, далее добавляете e-mail пользователей, которые будут тестировать приложение. Им будут приходить письма с приглашением и кодом, который даст возможность подключиться к программе тестирования — устанавливать тестируемое приложение.

В созданной группе тестировщиков есть 2 раздела: Тестировщики и Сборки:
  • в "тестировщиках" находятся почтовые адреса пользователей, которые будут подключаться к тестированию, а также ссылка на приложение, по которой указанные пользователи могут установить приложение.
  • в "сборках" находятся доступные сборки для тестирования — те, которые будут указаны вручную.

Также необходимо будет на телефон установить само приложение TestFlight.

Разработчику, администратору или владельцу учетной записи код вводить не надо будет. Будет доступна последняя загруженная версия приложения почти сразу после загрузки в App Store Connect.

А вот все остальные должны быть приглашены (будет прислан код активации), и доступна им будет та версия, которая будет указан в группе тестировщиков.

4 Загрузка в App Store Connect


Если установлена версия UE 4.24 (требуется Xcode 11) и выше, для загрузи приложения в App Store Connect нужен будет Transporter.

Если установлена версия UE 4.23 (требуется Xcode 10) и ниже, используется Application Loader:
image

В Transporter-е, чтобы залогиниться, используются учетные данные Apple ID, а в Application Loader только логин от него, а пароль придется сгенерировать, об этом можно почитать на официальной страницы Using app-specific passwords.

Так как у меня Windows, мне нужно перекидывать ipa-файлы в VPS. Я использую сервис Firefox Send. Мне он удобен тем, что не надо логиниться — открыл сайт, залил файл, получил ссылку, скачал файл в виртуалке.

5 Внутриигровые покупки


5.1 Настройки в App Store Connect


Перед отправкой приложения на проверку я сразу создал внутриигровые покупки. Как оказалось, их проверяют/одабривают вместе с приложением.
Чтобы покупки одобрили, желательно прикрепить скриншот окна с
покупками (для каждой покупки), где будет видна кнопка для совершения покупки. У меня был 1 скриншот на все покупки. Сам скриншот был сделан из редактора (не из игры), и подкорректирован.

Т.к. скриншот должен быть определенного размера (640x920 пикселей), мне пришлось части изображения прижать друг к другу. Таким образом, вид окна покупок на скриншоте и в игре отличаются.

image

Кнопки покупок обязательно должны быть видны, даже если при нажатии на них ничего не будет происходить.

Сначала я кнопки покупок скрывал, показывал только после получения информации по ним (цена, название, валюта, пр.) — так делать не надо. Из-за этого у меня приложение и покупки не проходили проверку.

5.2 Опция «bUseStoreV2» в файле конфигурации и метод «RestoreInAppPurchase»


По умолчанию для проекта включена опция "bUseStoreV2=true", см. "[EngineFolder]/Config/IOS/IOSEngine.ini". С ней у меня не работали внутриигровые покупки. И такая проблема была не у одного меня, исходя из количества постов на форуме и AnswerHub-е.

Решение: прописал строку "bUseStoreV2=false" в файле "[UnrealProject]/Config/IOS/IOSEngine.ini". Если файла нет, создаем — смотрим примеры проектов, либо в интернете ищем.

Конечно, при каждой покупке придется вводить логин/пароль от «Apple ID», но для меня это лучше, чем ничего, а времени разбираться не было.

Еще у меня не работало восстановление данных по покупкам (метод "RestoreInAppPurchase"), а главное — не отображались цены по покупкам (метод "ReadInAppPurchaseInformation), хотя на Android все прекрасно работало. После некоторого времени я убрал использование "RestoreInAppPurchase" (у меня была реклама, отключение которой можно было купить, но потом рекламу убрал, и соответственно данную покупку тоже, и отпала необходимость восстанавливать данные по приобретенным покупкам), и, о чудо — после этого стали загружаться цены в игре.

6 Ревью / Проверка


Как это было впервые у меня.
15.06 — 1-я отправка на проверку, через 14 часов сама проверка. Отклонили. Нужно было подтвердить, что игра соответствует указанным пунктам гайдлайна (список был в сообщении). Написал, что ничего не нарушаю, приложение полностью соответствует указанному гайдлайну.

18.06 — 2-я отправка, проверка через 2-е суток. Отклонили, написали, что игра у меня азартная и на деньги. Ответил, приложил скриншот с надписями, типа, где здесь азартная игра и игра на деньги.

21.06 — 3-я отправка. Спустя 9 дней, не дождавшись проверки, заливаю обновленную версию.

30.06 — 4-я отправка, проверка через 9 дней. Отклонили, нарушен пункт 2.3.1 гайдлайна (это когда приложение что-то скрытно может делать). Также заметил, что покупки тоже не прошли проверки — никакого письма я по этому поводу не получал. Позже понял (выше написал в п. 5.1), что покупки проверяются вместе с приложением. Для меня это было неочевидно. По поводу покупок — была надпись, что необходимо действие пользователя (точный текст уже не приведу). Зашел в каждую покупку, немного поменял название и описание. Зачем — не понял, добавил всего по паре слов в каждое поле. И, по-моему, тогда же загрузил скриншот окна покупок на всякий случай (см. п. 5.1). В этой версии кнопки покупок скрывались до получения информации по ним (которые еще не были одобрены, и, соответственно, не работали). Возможно, это одна из причин отклонения приложения как я понял уже потом.

После этого я уже не знал, что нужно сделать, чтобы приложение прошло проверку — искал, читал, думал. Написал команде проверке. Только после этого мне внятно ответили, что скриншот окна покупок не соответствует тому, что проверяющий видит в приложении, а он ничего не видел на тот момент.

17.07 — 5-я отправка, проверка через 7 дней. Отклонили, также нарушен пункт 2.3.1. После этого делаю кнопки покупок видимыми. Также я написал несколько сообщений команде проверке по разным темам с просьбой разобраться, либо объяснить, что я не так делаю. Еще подал апелляцию до кучи. В этот же день приложение проверяют, но отклоняют, уже не помню почему.

26.07 — 6-я отправка, проверка через 18 минут, еще через 18 минут получаю долгожданное одобрение.

Выводы (субъективно):

  • в Google Play для меня пройти проверку на одобрения приложения в магазин было просто, здесь же все под лупой посмотрят. Возможно, там боты, здесь люди. Что лучше? Не знаю.
  • ответы по результатам проверки по большей части не несут никакой информации о том, что надо исправить.
  • неочевидные моменты — покупки отклонили, а я узнал только тогда, когда решил зайти на страницу с их настройками, никаких сообщений не было.
  • для ускорения запуска проверки строчить во все инстанции Apple – писать сообщения в центре решений, подавать апелляцию (из центра решений), задавать вопросы команде проверки.

7 Краткое описание статьи


Мой чек-лист, который я составил для себя (примерный аналог официальной страницы), чтобы выпустить приложение на iOS:

  1. зарегистрировать и оплатить в участие в программе разработчиков.
  2. если у вас Windows — можно использовать VPS c macOS.
  3. при удаленной компиляции в macOS нужно установить только Xcode, Unreal Launcher/Editor/etc. устанавливать не надо.
  4. чтобы можно было импортировать профайлы в проект — статья.
  5. генерация профайлов и сертификатов — делать 2 шт. — development и distribution/shipping — статья.
  6. непосредственно импорт профайлов и сертификатов — статья.
  7. настройка удаленной компиляции перед сборкой проекта — статья.
  8. не забыть дать удаленный доступ по SSH в MacOS если его нет. Проверить доступ можно, например, через PyTTY.
  9. сборка проекта — статья. Внимание: при сборке с флагом «For Distribution» нужно выбрать distribution профайл/сертификат, иначе выбрать development профайл/сертификат. Выбирается в настройках проекта, либо в файле "Config/DefaultEngine.ini" секция "[/Script/IOSRuntimeSettings.IOSRuntimeSettings]", MobileProvision/SigningCertificate — строки.
  10. тестирование на устройстве — статья.

8 Заключение


Все это случилось со мной летом 2019 года. Что-то мог забыть и не так описать, какие-то моменты могут стать уже не актуальны.

Буду рад, если эта информацию кому-нибудь поможет.
Tags:
Hubs:
+8
Comments1

Articles