Релиз и публикация
Первый самостоятельный релиз мобильной игры — это несколько дней непрерывного стресса: проблемы с подписью сертификатов в последний момент, скриншоты не подходят под требования App Store, ревью отклоняют из-за пункта в EULA, который никто не читал. Студии, которые прошли через это однажды, выстраивают процесс, чтобы не повторять. Именно этот процесс мы берём за основу с первого дня проекта.
CI/CD для мобильных сборок
Ручная сборка и публикация — это не процесс, это лотерея. «Работает на моей машине» — не релизный критерий. Автоматизация пайплайна решает три проблемы: воспроизводимость сборок, скорость итераций и исключение человеческого фактора при подписи и заливке.
Инструменты пайплайна
GameCI — open-source Docker-образы для Unity-сборок. Работает поверх GitHub Actions, GitLab CI или любого другого CI-провайдера. Ключевые компоненты:
-
unity-builder— собирает проект под нужную платформу (Android, iOS, WebGL, Standalone) -
unity-test-runner— запускает Unity Test Framework перед сборкой -
unity-return-license— возвращает лицензию Unity после завершения задачи (критично для Pro-лицензий)
Unity Cloud Build — облачное решение от Unity. Проще в настройке, не требует собственного CI-сервера, но менее гибкое и дороже при высоком числе сборок. Хорошо подходит для небольших студий без DevOps-экспертизы.
Fastlane — стандарт для автоматизации финальных шагов: подпись, загрузка в магазины, управление метаданными. Работает как дополнение к GameCI или Unity Cloud Build.
Типовой пайплайн
# .github/workflows/build-mobile.yml (упрощённо)
jobs:
test:
name: Run Unity Tests
uses: game-ci/unity-test-runner@v4
with:
unityVersion: 2022.3.20f1
testMode: playmode
build-android:
name: Build Android
needs: test
uses: game-ci/unity-builder@v4
with:
targetPlatform: Android
androidKeystoreName: release.keystore
androidKeystoreBase64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
androidKeystorePass: ${{ secrets.KEYSTORE_PASSWORD }}
androidKeyaliasName: ${{ secrets.KEY_ALIAS }}
androidKeyaliasPass: ${{ secrets.KEY_PASSWORD }}
upload-to-play:
name: Upload to Google Play (Internal Track)
needs: build-android
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: com.yourcompany.yourgame
releaseFiles: build/Android/*.aab
track: internal
Несколько важных деталей этой схемы:
Секреты, не переменные. Keystore, сертификаты, service account JSON — всё это хранится в secrets CI-провайдера, а не в репозитории. Попадание keystore в git — потенциальная компрометация ключей подписи.
AAB вместо APK для Google Play. App Bundle обязателен с 2021 года для новых приложений. Он меньше и позволяет Play Dynamic Delivery доставлять только нужные нативные библиотеки под каждое устройство.
Треки публикации. В Google Play четыре трека: internal → closed testing → open testing → production. Каждый автоматический билд уходит на internal. Продвижение по трекам — ручное или через Fastlane supply promote.
iOS-специфика
iOS-сборка сложнее Android из-за жёстких требований Apple к подписи.
Xcode и Provisioning Profiles. Unity собирает Xcode-проект, который затем компилируется через xcodebuild. Для CI нужно:
- Сертификат подписи (Distribution Certificate) в keychain агента
- Provisioning Profile (App Store Distribution) прикреплён к Bundle ID
Fastlane Match решает проблему распределения сертификатов в команде: все сертификаты и профили хранятся в зашифрованном git-репозитории, каждый разработчик и CI-агент синхронизирует их через fastlane match.
# Fastfile
lane :build_ios do
match(type: "appstore", readonly: true)
build_app(
workspace: "Unity-iPhone.xcworkspace",
scheme: "Unity-iPhone",
export_method: "app-store"
)
upload_to_testflight
end
App Store Connect API Key — заменяет логин/пароль Apple ID для CI. Fastlane и xcodebuild поддерживают аутентификацию через API Key, что надёжнее и не ломается при двухфакторной аутентификации.
Процесс ревью: где чаще всего отклоняют
App Store (Apple)
Apple отклоняет примерно 30-40% первых сабмишенов новых студий. Наиболее частые причины:
Метаданные и маркетинговые материалы:
- Скриншоты содержат UI устройства или чужие бренды
- Описание упоминает конкурентов или другие платформы («также доступно на Android»)
- Иконка нарушает гайдлайны (нет альфа-канала, неправильный размер)
Технические требования:
- Приложение крашится при ревью (Apple тестирует на iPad, даже если игра только для iPhone)
- Отсутствует поддержка IPv6 — Apple требует с 2016 года, но до сих пор отклоняют
- Не реализован Sign in with Apple, если есть сторонние провайдеры авторизации (Google, Facebook)
Контент и политики:
- Внутриигровые покупки не раскрыты в метаданных (нужен флаг «In-App Purchases»)
- Отсутствует ссылка на Privacy Policy прямо в App Store Connect (не в игре, а в записи приложения)
- Loot boxes без раскрытия вероятностей в юрисдикциях, где это обязательно
Практика: перед первым сабмишеном проходите App Store Review Guidelines от начала до конца. Это 2-3 часа, которые экономят 2-3 недели.
Google Play
Google Play более лояльный и автоматизированный. Типичные причины отклонения:
-
Target API Level — Google требует актуальный
targetSdkVersion. На 2024 год — минимум API 34. Unity 2022.3+ выставляет это автоматически. - Разрешения — запрос избыточных разрешений (READ_EXTERNAL_STORAGE без обоснования)
- Политика данных — Data Safety Form в Play Console должна соответствовать реальному поведению приложения. Если используете Firebase Analytics — укажите это явно.
Маркетинговые материалы
Технически это не разработка, но без правильно подготовленных материалов ни App Store, ни Google Play не пустят. Требования:
App Store:
- Скриншоты: 6.7" (iPhone 15 Pro Max), 12.9" iPad Pro — обязательные размеры
- Превью-видео: 15-30 секунд, формат H.264 или HEVC
- Иконка: 1024×1024 PNG без закруглённых углов (iOS сам закругляет)
Google Play:
- Feature Graphic: 1024×500 (баннер вверху страницы приложения) — часто упускают
- Скриншоты: минимум 2, максимум 8 на тип устройства
- Иконка: 512×512 PNG с альфа-каналом
App Store Optimization (ASO): ключевые слова в названии и поле Keywords (iOS) или в описании (Android) напрямую влияют на органические установки. Инструменты: AppFollow, Sensor Tower, data.ai.
Локализация и региональные требования
Если игра выходит в нескольких регионах, локализация затрагивает не только текст, но и процесс публикации:
- Метаданные в магазинах нужно локализовать отдельно — App Store Connect и Google Play Console позволяют добавлять переводы для каждого языка
- Возрастные рейтинги различаются: IARC (глобально), ESRB (США), PEGI (Европа), CERO (Япония). В App Store Connect и Play Console есть встроенные анкеты для IARC-рейтинга
- Китайский рынок требует отдельного лицензирования (ICP-лицензия, версионное согласование с регулятором) — это отдельный проект минимум на 6 месяцев
После релиза: мониторинг и обновления
Релиз — не финальная точка. Первые 72 часа критичны:
- Краш-рейт мониторим через Firebase Crashlytics. Приемлемый уровень для mobile — ниже 1%. Если выше — нужен hotfix.
- ANR-рейт в Google Play Console — ниже 0.47% (иначе Play может ограничить видимость приложения).
- Отзывы в первые дни — реальная обратная связь. Часто выявляют проблемы на специфических устройствах или ОС.
Phased rollout — постепенное развёртывание — обязателен для значимых обновлений. Google Play позволяет выпускать обновление сначала на 10%, затем 50%, затем 100% пользователей. App Store — аналогично через Phased Release. Это позволяет поймать критический баг до того, как он ударит по всей аудитории.





