Sokopango Game (продолжение) – iOS
Мне уже 35, я до сих пор немного бородат, и я наконец-то выпустил игру в App Store.
Это статья является продолжение моей истории создания 1-й игры, используя Unreal Engine 4.
1. Введение.
В этой статье я опишу проблемы, с которыми столкнулся при выпуске игры на iOS, для App Store, и их решения. Постараюсь дать как можно больше полезной информации с надеждой, что это кому-нибудь пригодится.
Я работаю в Windows, компьютера с MacOS у меня нет. Большая часть операций будет происходить в Windows, но для некоторых все равно понадобится MacOS (об этом далее).
Игра написана на Unreal Engine 4.22.
2. TL;DR
51 день прошло от момента, как я приступил к сборке под iOS, до получения счастливого письма с темой "The status of your app, Sokopango, is now "Ready for Sale".". Последние 40 минут которых прошли между отправкой приложения на ревью и его успешным прохождением.
3. Первые шаги в App Store Connect.
Писать о том, как зарегистрировать аккаунт разработчика и создавать страницу приложения, я не буду.
3.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.
Поэтому если будете оплачивать взнос с карты, данные о держателе которой отличаются от ваших ФИО, будьте готовы подтвердить личность разработчика.
3.2. Видео для предпросмотра приложения.
В настройках страницы приложения помимо скриншотов приложения можно загрузить еще видео. В Google Play просто вставляется ссылка на видео из YouTube. Особенность в следующем, цитата:
Чтобы загрузить видео для предпросмотра приложения, необходимо использовать Safari и OS X версии 10.10 и новее.
Как оказалось, картинки можно загружать с любой ОС, а видео только с MacOS (вернее только из браузера Safari, который есть только в MacOS).
Также обращу ваше внимание на разрешение видео, цитата:
App preview dimensions should be: 1920x886, 886x1920.
Если вы, как и я, сделаете видео в другом разрешении (я сделал трейлер в Full HD), вам придется его корректировать. У меня руки до сих пор не дошли, поэтому на момент написания статьи видео для предпросмотра на странице приложения до сих пор отсутствует.
3.3. Прочее.
- Удивило, что нет категории игр Аркады. В итоге поставил Казуальные и Стратегии.
- В покупках нельзя поставить произвольную цену, в отличие от Google Play.
4. Сборка проекта.
4.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 профайла - также для магазина и тестирования (тут понадобится указать устройства, на которые можно будет установить приложение).
Также на всякий случай надо знать, где находятся файлы профайлов. Я по незнанию сгенерировал несколько профайлов. После поочередного их импорта в проект он не собрался (разбор данной ошибки в разделе "Ошибки при сборке и их решения").
Находятся профайлы в "C:\Users\%UserName%\AppData\Local\Apple Computer\MobileDevice\Provisioning Profiles\".
Я почистил каталог, заново импортировал актуальные профайлы в проект (Project Settings - Platforms - iOS - Import Provision). После этого проект удачно собрался.
4.2. Если нет MacOS.
Благодаря политики Apple, для сборки проекта под iOS нужна MacOS. У меня Windows, кросс-компиляцию, как для сборки под Linux, сделать нельзя.
Как я писал в предыдущей статье, попытки установить/запустить виртуальный образ MacOS у меня не получилось.
В комментариях предложили аренду. Я поискал, и нашел HostMyApple.
Регистрация и оплата совмещены, т.е. нельзя просто зарегистрировать, придется сразу платить (я такое увидел впервые). Купил тариф "macOS Mojave Cloud Basic" - 34.99 долларов в месяц. Сразу после регистрации/оплаты получил письмо с инструкцией и доступами.
Чтобы заходить на удаленный сервер, нужно будет поставить "NoMachine Enterprise Client". Зашел, обновил ОС (была не самая последняя версия), поставил Xcode - больше ничего ставить не надо.
Проблема: у меня при сборке была ошибка, частичный текст которой "Invalid SDK MacOSX.sdk ..." и "Invalid SDK iPhoneOS.sdk ...". Очень долго с ней промучался.
Решение: запуск команды "sudo xcode-select -r" в терминале.
4.3. Удаленная компиляция.
VPS арендовали, проект настроили, Xcode поставили - пора собирать проект. Но для начала надо настроить удаленную компиляцию и подготовится к ней. Настройку смотрите также в официальной документации.
Так же нужно временно отключить имеющийся SSH-клиент, иначе при удаленной компиляции будет ошибка, связанная с rsync (текст ошибки не помню). У меня Windows 10, я просто переименовал папку "C:\Windows\System32\OpenSSH". После этого в терминале можно выполнить команду "where ssh.exe", чтобы проверить, что ОС не имеет доступных SSH-клиентов. Ответ у меня "ИНФОРМАЦИЯ: не удается найти файлы по заданным шаблонам.". Помог этот пост.
В моём VPS SSH настраивать не надо было - все работало из коробки. У вас может быть по другом.
4.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 для тестирования.
Меня очень удивил большой размер файла. Были даже вопросы на форуме UE, ответов, правда, не было. Потом понял, что в нем содержатся ресурсы для разных устройств. Вот что отображается у меня:
4.5. Ошибки при сборке и их решения.
4.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.
- что-то еще было написано.
Эти ошибки появляются на закладке "Massage Log".
Решение – очистка файлов профайлов в каталоге и повторное их импортирование в настройках проекта, хотя их можно импортировать и через IPhonePackager.
Ошибки вылезали возможно из-за того, что я профайлы и сертификаты импортировал и в настройках редактора, и через IPhonePackager. В итоге их было несколько, хотя должно было быть по 2 шт.
4.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" (писал об этом выше).
4.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 раза приходится ее заново запускать, чтобы проект собрался. Притом сборка прерваться может как в начале, так и ближе к концу.
4.5.4. Не собирается с включенной опцией "Enable Remote Shader Compile".
Не разобрался, я и без нее собираю проект. Упомянул здесь, т.к. в инструкциях на сайте UE про нее что-то есть.
4.5.5. 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, сохранил.
- Сборка прошла успешно.
- После пришлось удалять невалидные профайлы и делать новые. Либо можно попробовать зайти в профайл, сохранить его, из невалидного он превратится в валидный.
5. Тестирование.
5.1. Через USB.
Для тестирования на телефоне при установке приложения через USB нужно использовать Development сертификат и Development профайл с указанным UDID устройства. Соответственно проект должен быть собран именно с этим сертификатом и профайлом. Как я писал выше, не имеет значения, какая опция выбрана в "Build Configuration" - Development или Shipping, но флаг "For Distribution" должен быть снят. Приложение устанавливается через программу IPhonePackager (путь "%EnginePath%\Engine\Binaries\DotNET\IOS\IPhonePackager.exe", у меня в "C:\Program Files\Epic Games\UE_4.21\Engine\Binaries\DotNET\IOS"). При запуске откроется диалоговое окно выбора проекта, его нужно закрыть. В открывшейся программе нужно перейти на закладку "Advanced Tools" - нажать на кнопку "Install IPA to hardware ..." - выбрать ipa-файл - дождаться успешной установки. У меня установка на телефон занимает от 20 до 80 секунд (в зависимости от размера файла, который зависит от конфигурации сборки).
У меня периодически не получается установить приложение через IPhonePackager.
Ошибка: "Install \ Update of "FileName.ipa" failed with Package Extraction Failed Error in ..."
Особенность ошибки в том, что либо зависает отправка файла (он отправляется частями), либо он ну очень быстро копируется на телефон (пол гигабайта за секунду).
Решение (не всегда для моего случая) - переподключить кабель к телефону, или воткнуть другой кабель, или перезагрузить телефон. Но иногда ничего из этого не помогает (хотя iTunes телефон видит). Может фаза луны не та, не знаю. Приходится откладывать тестирование на потом.
5.2. Через программу TestFlight.
В App Store Connect в разделе TestFlight:
- в подразделе "Пользователи App Store Connect" добавляете себя.
- в подразделе "Тестировщики и группы" добавляете группу тестировщиков, далее добавляете e-mail пользователей, которые будут тестировать приложение. Им придет письмо (приглашение) с кодом, который даст возможность подключиться к программе тестирования вашего приложения.
Также необходимо будет на телефон установить само приложение TestFlight.
Вам, как разработчику, администратору и владельцу учетной записи код вводить не надо будет. Вам будет доступна последняя загруженная версия приложения. А вот всех остальных нужно будет пригласить, и доступна им будет та версия, которую вы укажите для тестирования в группе тестировщиков.
В созданной группе тестировщиков есть 2 раздела: Тестировщики и Сборки. В тестировщиках находятся почтовые адреса пользователей, которые будут подключаться к тестированию, а также публичная ссылка на приложение. В сборках доступные сборки для тестирования - те, которые вы укажите
6. Загрузка в App Store Connect.
Для загрузки приложения используется утилита "Application Loader" от Xcode.
Для этого понадобится отдельный пароль. Как его сгенерировать, можно почитать на официальной страницы Using app-specific passwords.
Так как у меня Windows, мне нужно перекинуть ipa-файл в VPS. Я использую сервис Firefox Send. Мне он удобен тем, что не надо логиниться - открыл сайт, залил файл, получил ссылку, скачал файл.
7. Внутриигровые покупки.
Перед отправкой приложения на ревью я сразу создал внутриигровые покупки. Их проверяют вместе с приложением, а не отдельно. Чтобы покупки одобрили, желательно прикрепить скриншот окна с покупками (для каждой покупки), где будет видна кнопка для совершения покупки.
У меня был 1 скриншот на все покупки. Сам скриншот был сделан из редактора (не из игры), и подкорректирован - т.к. скриншот должен быть определенного размера (640x920 пикселей), мне пришлось части изображения прижать друг к другу. Таким образом, изображения окна покупок на скриншоте и в игре отличаются.
Обязательно кнопки покупок должны быть видны, даже если при нажатии на них ничего не происходит! Изначально я кнопки покупок скрывал, появлялись они после получения информации по покупкам (цена, название, валюта, пр. - было видно на Android-приложении) - так делать не надо. Из-за этого у меня приложение и покупки долго не проходили ревью.
8. Ревью / Проверка.
15.06 - 1-я отправка на ревью, ревью через 14 часов. Отклонили. Нужно было подтвердить, что игра соответствует указанным пунктам гайдлайна (список был в сообщении). Написал, что ничего не нарушаю, приложение соответствует гайдлайну.
18.06 - 2-я отправка, ревью через 2 суток и 5 часов. Отклонили, написали, что игра у меня азартная и на деньги. Ответил, приложил скриншот с надписями, типа, где вы здесь увидели азартную игру и игру на деньги. Ждал неделю, думал, что ответят. Хрен там!
21.06 - 3-я отправка. Ревью через 9 дней, не дождавшись его, залил обновленную версию.
30.06 - 4 отправка, ревью через 10 дней. Отклонили, нарушен пункт 2.3.1 гайдлайна (это когда приложение что-то скрытно может делать). Также заметил, что покупки тоже не прошли проверки - никакого письма я по этому поводу не получал. Позже понял (выше написал), что покупки проверяются вместе с приложением. Для меня это было неочевидно.
По поводу покупок - была надпись, что необходимо действие пользователя (точный текст уже не приведу). Зашел в каждую покупку, немного поменял название и описание, т.к. требовалось. Зачем, не понял - добавил всего по паре слов в каждое поле. И, по-моему, тогда же загрузил скриншот окна покупок на всякий случай. В этой версии кнопки покупок скрывались до получения информации о покупках.
После этого я не понимал, что нужно сделать, чтобы приложение прошло проверку - искал, читал, думал. Написал команде проверке. Только после этого мне внятно ответили, что скриншот окна покупок не соответствует тому, что ревьювер видит в приложении, а он ничего не видел на тот момент.
17.07 - 5-я отправка, ревью через 7 дней и 3 часов. Отклонили, также нарушен пункт 2.3.1. После этого делаю кнопки покупок видимыми. Черт с тем, что покупки не работают, думал я. Также я написал несколько сообщений команде ревью по разным темам (выбор поля "I would like to") с просьбой разобраться, либо объяснить, ЧЯДНТ. Еще подал апелляцию до кучи. В этот же день приложение проверяют. Совпадение? Не думаю.
26.07 - 6-я отправка, ревью через 18 минут, еще через 18 минут получаю долгожданное одобрение.
Выводы (сугубо мои):
- в Google Play для меня пройти ревью было просто, здесь же все под лупой посмотрят. Видно там боты, здесь люди. Что лучше? Не знаю.
- вытекает из предыдущего пункта - долго ждать, но ниже будет вроде как решение.
- ответы по результатам проверки по большей части на от%*?@сь.
- неочевидные моменты - покупки отклонили, а я узнал, только когда решил зайти на их страницу настроек, никаких сообщений не было.
- для ускорения запуска проверки строчить кляузы во все инстанции Apple – писать сообщения в центре решений, подавать апелляцию (из центра решений), задавать вопросы команде ревью.
9. Почти счастливый конец.
Игра теперь в App Store.
Но!
На данный момент сами покупки у меня до сих пор не работают. У меня 1 код для работы с покупками как с Google Play, так и с App Store (Blueprint в виджете). На Android покупки работают, в iOS нет.
Чтобы исправить проблему, за основу брал как наработки из проекта "UnrealMatch3" (узлы Blueprin, файл конфигурации, *.Build.cs-файлы), так и много чего пробовал из документации/форумов/ответов с сайта эпиков.
Больше всего удивило то, что я установил UnrealMatch3 из магазина, и в нем тоже не работает покупка (она там всего одна). В общем если кто-нибудь поможет, буду очень благодарен - внесу имя спасителя в раздел "Thanks" в самой игре.
10. Краткое описание.
Мой чек-лист, который я составил для себя (примерный аналог официальной страницы), чтобы выпустить приложение на iOS:
- вступить в Apple Developer Program.
- нужен Mac - можно использовать сервис.
- установить только Xcode, Unreal Launcher/Editor/etc. устанавливать не надо.
- чтобы можно было скопировать профайлы - смотри сюда.
- генерация профайлов и сертификатов - делать 2 шт. - development и distribution/shipping - читать здесь.
- импорт профайлов и сертификатов - ссылка.
- настройки удаленной компиляции перед сборкой проекта - опять ссылка.
- не забыть дать удаленный доступ по SSH в MacOS если его нет. После проверить доступ, например, через PyTTY.
- сборка проекта - ссылка.
- тестирование на устройстве - ссылка.
Лига Разработчиков Видеоигр
7.3K постов22.4K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"