Підписання білдів ігор для App Store
Xcode Organizer показує «Upload Successful» — і App Store Connect відправляє лист: «Missing required icon», хоча іконки є в Assets.xcassets. Або білд прийнятий, але TestFlight-білд падає при старті з SIGABRT тому що в Release конфігурації не встановлений флаг Enable Bitcode = NO для одного з плагінів. iOS-сборка для App Store — це управління процесом з дюжиною точок відмови.
Що ломається без правильно вистроєного пайплайна
Code signing хаос. У середнього Unity-проекту з 15+ плагінами — кілька provisioning profile'ів, ручне управління сертифікатами Developer та Distribution, запутані Capabilities (Push Notifications, In-App Purchase, Game Center, Sign in with Apple). При сборці на CI-машині без Keychain з потрібними сертифікатами отримуємо No signing certificate "iOS Distribution" found. Fastlane Match вирішує це систематично: сертифікати та профілі зберігаються в git-репозиторії (зашифровані), CI забирає їх через match(type: "appstore") — ніякого ручного експорту .p12.
Entitlements. Unity генерує Unity-iPhone.entitlements при експорті Xcode-проекту. Якщо Automatically Sign включена в неправильний момент — Xcode перезаписує entitlements, убираючи вручну додані capabilities. PBXProject API в Unity (через UnityEditor.iOS.Xcode) дозволяє програмно додавати entitlements в post-build скрипті — це надійніше ручного редагування.
Incrementing build number. App Store Connect не приймає білд з тим же CFBundleVersion, що і попередній — навіть якщо CFBundleShortVersionString змінився. При ручній сборці про це забувають приблизно в 30% випадків. Автоматизація через Fastlane: increment_build_number(build_number: latest_testflight_build_number + 1).
Як ми будуємо процес сборки
Базовий інструмент — Fastlane з Gymfile під iOS. Unity-специфіка: перед викликом gym потрібен крок сборки Unity через командний рядок:
Unity.exe -batchmode -executeMethod BuildScript.BuildiOS -projectPath . -logFile build.log -quit
BuildScript.BuildiOS через BuildPlayerOptions встановлює BuildTarget.iOS, BuildOptions.Il2CPP, настроює PlayerSettings під конкретний білд (bundle ID, версію, іконки).
Після експорту Xcode-проекту — post-build обробка через PostProcessBuild-атрибут: додаємо потрібні frameworks, чиним Info.plist (NSPhotoLibraryUsageDescription, Privacy manifest для iOS 17), настроюємо linker flags для плагінів з Objective-C categories.
Підписання та архівування через xcodebuild archive, потім xcodebuild -exportArchive з .plist конфігурацією ExportOptions (метод підписі app-store, правильний provisioning profile по bundle ID, включення bitcode при необхідності).
Завантаження в App Store Connect через xcrun altool --upload-app або Fastlane deliver/pilot. pilot для TestFlight дозволяє відразу призначити групи тестувальників та встановити release notes.
Автоматизація на CI/CD
Для ігрових студій оптимально — GameCI (GitHub Actions + Unity). Workflow: тригер на push в release ветку → сборка Unity → Fastlane signing → завантаження в TestFlight → Slack-повідомлення.
Секрети (сертифікати, Apple ID credentials, App Store Connect API key) зберігаються в GitHub Secrets або Vault. Apple рекомендує переходити з username/password на App Store Connect API Key (JWT) — надійніше та не вимагає двохфакторної аутентифікації в CI.
Терміни
| Задача | Термін |
|---|---|
| Разова сборка та завантаження в TestFlight | 0.5–1 день |
| Настройка Fastlane Match + первинна настройка signing | 1–2 дні |
| Повний CI/CD пайплайн (GameCI + Fastlane + TestFlight) | 3–7 днів |
Вартість визначається після аудиту поточної інфраструктури CI та стану сертифікатів/профілів.





