Релиз та публікація
Перший самостійний релиз мобільної гри — це кілька днів безперервного стресу: проблеми з підписом сертифікатів у останній момент, скриншоти не підходять під вимоги 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-збірка складніша через жорсткі вимоги 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. Прийнятний рівень для мобайлу — нижче 1%. Якщо вище — потрібен hotfix.
- ANR-рейт у Google Play Console — нижче 0.47% (інакше Play може обмежити видимість додатку).
- Рецензії в перші дні — реальна зворотна реакція. Часто виявляють проблеми на специфічних пристроях або ОС.
Phased rollout — постійне розгортання — обов'язковий для значимих оновлень. Google Play дозволяє випустити оновлення спочатку на 10%, потім 50%, потім 100% користувачам. App Store — аналогічно через Phased Release. Це дозволяє піймати критичний баг до того, як він вдарить по всій аудиторії.





