Тестирование игры на Unity под iPhone — критически важный этап разработки, который определяет, насколько стабильно ваше приложение будет работать на устройствах Apple. Даже идеально работающий проект в редакторе может выдавать ошибки на реальном девайсе: от падений FPS до полного краша при запуске. Причины кроются в особенностях iOS, ограничениях Metal API, и даже в специфике конкретных моделей iPhone (например, перегрев на iPhone 12 Pro при высокой нагрузке).
В этом руководстве мы разберём весь процесс — от подготовки среды разработки до финального тестирования через TestFlight. Вы узнаете, как избежать типичных ошибок при сборке .ipa, настроить профили provisioning в Apple Developer Account, и какие инструменты использовать для отладки производительности. Особое внимание уделено нюансам работы с Unity 2022 LTS и Xcode 15, а также решениям для частых проблем вроде ITMS-90087 или Missing Push Notification Entitlement.
1. Подготовка среды: что нужно до сборки проекта
Прежде чем собирать игру под iOS, убедитесь, что ваша система соответствует минимальным требованиям. Unity и Xcode предъявляют жёсткие условия к окружению, иначе сборка просто не запустится.
Во-первых, проверьте версию macOS: для Xcode 15 требуется macOS Ventura 13.3 или новее. Если у вас MacBook Pro M1, обновите Rosetta 2 — без неё некоторые плагины (например, Firebase) могут не скомпилироваться. Во-вторых, установите последнюю версию Unity Hub и модуль поддержки iOS для вашей версии движка. Для Unity 2022.3 LTS это делается через Unity Hub → Installs → Add Modules.
- 🖥️ Операционная система: macOS 13.3+ (для Xcode 15)
- 🛠️ Unity: версия 2022.3 LTS или новее (с модулем iOS Build Support)
- 📱 Xcode: последняя стабильная версия из App Store (не бета!)
- 🔑 Apple Developer Account: платная подписка ($99/год) для распределения билдов
Не менее важно настроить сам проект Unity под iOS. Перейдите в File → Build Settings, выберите платформу iOS и нажмите Switch Platform. Затем откройте Player Settings и проверьте:
- 📱 Target Device:
iPhone and iPad(если игра универсальная) - 🎮 Graphics API: только
Metal(OpenGLES устал и не поддерживается с iOS 12) - 🔒 Scripting Backend:
IL2CPP(обязательно для App Store) - 📦 Strip Engine Code:
Enabled(уменьшает размер билда)
⚠️ Внимание: Если вы используете плагины с нативным кодом (например, AdMob или GameAnalytics), убедитесь, что они совместимы сIL2CPP. Некоторые старые версии могут вызывать ошибки линковки типаundefined symbols.
2. Настройка Apple Developer Account и сертификатов
Без правильно настроенного Apple Developer Account вы не сможете собрать игру даже для тестирования. Первым делом зарегистрируйтесь в программе разработчиков (developer.apple.com) и оплатите подписку ($99/год). После этого создайте:
- App ID (Bundle Identifier) — уникальный идентификатор вашей игры (например,
com.yourcompany.gamename). Он должен совпадать с тем, что указан вPlayer Settings → Bundle Identifierв Unity. - Provisioning Profile — файл, связывающий ваш App ID, сертификаты и устройства для тестирования. Для разработки выберите
iOS App Development. - Сертификат разработчика (
Apple Development) — генерируется через Keychain Access на Mac.
Чтобы создать сертификат:
- Откройте Keychain Access →
Certificate Assistant → Request a Certificate From a Certificate Authority. - Введите email (должен совпадать с аккаунтом разработчика) и сохраните файл
.certSigningRequest. - Загрузите этот файл в Apple Developer Account в разделе
Certificates, Identifiers & Profiles → Certificates.
После генерации сертификата скачайте его и установите двойным кликом. Затем создайте Provisioning Profile:
- В Apple Developer Account перейдите в
Profiles→Development→iOS App Development. - Выберите ваш App ID, сертификат и добавьте тестовые устройства (их
UDIDможно получить через Xcode или Unity при подключении iPhone по кабелю). - Скачайте профиль и перетащите его в Xcode или поместите в папку
~/Library/MobileDevice/Provisioning Profiles/.
| Тип файла | Где создать | Как установить | Срок действия |
|---|---|---|---|
Сертификат разработчика (.cer) |
Apple Developer Account → Certificates | Двойной клик (установится в Keychain) | 1 год |
Provisioning Profile (.mobileprovision) |
Apple Developer Account → Profiles | Перетащить в Xcode или в папку ~/Library/... |
1 год (или до истечения сертификата) |
App ID (Bundle Identifier) |
Apple Developer Account → Identifiers | Прописать в Player Settings в Unity |
Бессрочно |
⚠️ Внимание: Если вы тестируете игру с Game Center или In-App Purchases, не забудьте включить соответствующие Capabilities в Xcode после сборки. В противном случае эти функции не будут работать даже в тестовом билде.
3. Сборка игры в Unity и экспорт в Xcode
Когда все настройки готовы, можно собирать проект. В Unity перейдите в File → Build Settings, выберите iOS и нажмите Build. Укажите папку для экспорта (например, ~/Desktop/iOSBuild) — Unity сгенерирует проект Xcode (.xcodeproj).
Процесс сборки может занять от 5 до 30 минут в зависимости от размера проекта и мощности Mac. Если сборка прерывается с ошибкой, проверьте:
- 🔧 Ошибки скриптов: в консоли Unity могут быть предупреждения о несовместимости кода с
IL2CPP. - 📁 Пути к файлам: если используете кастомные шейдеры или плагины, убедитесь, что пути к ним не содержат кириллических символов.
- 🔄 Кэш Unity: иногда помогает очистка через
Edit → Preferences → Cache → Clear Cache.
После успешной сборки откройте сгенерированный проект в Xcode. Здесь нужно:
- Выбрать схему сборки (
Generic iOS Deviceили конкретное устройство). - Проверить, что в
Signing & Capabilitiesвыбран правильный Team (ваш Apple Developer Account) и Provisioning Profile. - Если используете Firebase или другие SDK, добавьте необходимые фреймворки через
Build Phases → Link Binary With Libraries.
Теперь можно собрать билд для тестирования. Подключите iPhone по кабелю, выберите его в Xcode как целевое устройство и нажмите Build (или ⌘ + B). Если всё прошло успешно, игра установится на телефон.
Указан правильный Bundle Identifier|Выбран верный Provisioning Profile|Подключено тестовое устройство|Отключены ненужные Capabilities (например, Push Notifications)|Проверены зависимости (Firebase, AdMob и т.д.)
-->
4. Тестирование на устройстве: инструменты и методы
Установить игру на iPhone — только половина дела. Теперь нужно протестировать её на стабильность, производительность и совместимость. Вот ключевые аспекты, на которые стоит обратить внимание:
- 🎮 Производительность: FPS, загрузка CPU/GPU, потребление памяти. Используйте Xcode Instruments (особенно
Time ProfilerиMetal System Trace). - 🔋 Нагрев и батарея: некоторые игры на iPhone 13 Pro могут перегреваться из-за Metal-рендера. Следите за температурой через Battery Health в настройках.
- 📶 Сетевые запросы: если игра использует онлайн-сервисы, тестируйте её в разных условиях сети (Wi-Fi, 4G, офлайн).
- 🎵 Звук и вибрация: на iPhone без Taptic Engine (например, iPhone SE 2020) вибрация может работать иначе.
Для глубокой отладки используйте:
- 🛠️ Xcode Instruments: инструмент для анализа производительности. Запускается через
Xcode → Product → Profile. - 📊 Unity Profiler: подключите iPhone к Unity через
Window → Analysis → Profilerи выберите устройство. - 🔍 Console Logs: в Xcode откройте
View → Debug Area → Activate Console, чтобы увидеть логи игры.
Особое внимание уделите тестированию на разных моделях iPhone. Например:
- iPhone 8 (чип A11 Bionic): может тормозить при сложных шейдерах.
- iPhone 12 Pro (чип A14): проверьте поддержку LiDAR для AR-игр.
- iPhone 14 Pro (чип A16): тестируйте ProMotion (120 Гц) и Always-On Display.
⚠️ Внимание: Если игра использует ARKit, обязательно протестируйте её на устройствах с LiDAR (iPhone 12 Pro+, iPad Pro 2020+). На моделях без LiDAR (например, iPhone 11) некоторые функции могут работать хуже или не работать вообще.
5. Тестирование через TestFlight: распределение билдов
TestFlight — официальный инструмент Apple для бета-тестирования приложений. Он позволяет распределить билд среди тестеров (до 10 000 человек) без публикации в App Store. Чтобы загрузить игру в TestFlight:
- Соберите архив (
.ipa) в Xcode черезProduct → Archive. - В открывшемся окне Organizer выберите ваш билд и нажмите
Distribute App→TestFlight. - Заполните метаданные (описание, скриншоты, notas для тестеров) и отправьте на ревью.
Обычно модерация занимает от нескольких часов до 2 дней. После одобрения вы сможете добавить тестеров по email или через публичную ссылку (доступно для внешнего тестирования). Обратите внимание:
- 📅 Срок действия билда: 90 дней с момента загрузки. После истечения нужно загружать новый.
- 📱 Ограничения: на одном устройстве можно тестировать до 30 приложений одновременно.
- 📊 Аналитика: в App Store Connect доступны данные о крашах и отзывах тестеров.
Если Apple отклонила ваш билд, проверьте частые причины:
- 🚫
ITMS-90087: неверный Bundle Identifier или Provisioning Profile. - 🚫
Missing Purpose String: если игра запрашивает доступ к камере/микрофону, нужно добавить описание вInfo.plist. - 🚫
Invalid Swift Support: возникает, если в проекте есть Swift-код, но не подключен Swift Standard Libraries.
| Ошибка | Причина | Решение |
|---|---|---|
ITMS-90087 |
Несовпадение Bundle ID или профиля | Проверьте Player Settings и Provisioning Profile |
Missing Push Notification Entitlement |
Включены Push Notifications, но нет сертификата | Отключите Capabilities → Push Notifications или добавьте сертификат |
Invalid Swift Support |
Отсутствует поддержка Swift в билде | В Xcode включите Always Embed Swift Standard Libraries |
6. Автоматизация тестирования: Unity Test Framework и CI/CD
Ручное тестирование отнимает много времени, особенно если игра сложная. Для автоматизации используйте Unity Test Framework (UTF) и системы непрерывной интеграции (CI/CD) типа GitHub Actions или Bitrise.
UTF позволяет писать тесты на C# прямо в Unity. Например, чтобы проверить загрузку уровня:
using UnityEngine;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
public class LevelLoadTests {
[UnityTest]
public IEnumerator LevelLoadsWithoutErrors() {
yield return new LoadSceneOperation("Level1");
Assert.IsNotNull(GameObject.Find("Player")); // Проверяем, что игрок заспавнился
}
}
Для интеграции с CI/CD настройте автоматическую сборку и загрузку в TestFlight. Пример конфигурации для GitHub Actions:
name: Build and Deploy to TestFlight
on:
push:
branches: [ main ]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-unity@v2
with:
unity-version: 2022.3.16f1
- run: unity -batchmode -projectPath . -executeMethod Builder.BuildiOS
- run: xcodebuild -exportArchive -archivePath build/iOS/Game.xcarchive -exportPath build/iOS/ipa -exportOptionsPlist ExportOptions.plist
- uses: apple-actions/upload-testflight-build@v1
with:
app-path: build/iOS/ipa/Game.ipa
issuer-id: ${{ secrets.APPLE_ISSUER_ID }}
api-key-id: ${{ secrets.APPLE_KEY_ID }}
api-private-key: ${{ secrets.APPLE_PRIVATE_KEY }}
Преимущества автоматизации:
- ⏱️ Экономия времени: тесты запускаются при каждом коммите.
- 🐞 Раннее выявление багов: ошибки фиксируются до того, как билд попадёт к тестерам.
- 📈 Консистентность: исключает человеческий фактор (например, забыли протестировать на iPhone SE).
⚠️ Внимание: При настройке CI/CD для iOS-билдов убедитесь, что виртуальная машина (GitHub Actions, Bitrise) имеет доступ к вашим сертификатам и Provisioning Profiles. Для этого экспортируйте их из Keychain в .p12 и загрузите как secrets в репозиторий.
7. Частые проблемы и их решения
Даже опытные разработчики сталкиваются с ошибками при тестировании Unity-игр на iPhone. Вот самые распространённые проблемы и способы их решения:
- 🔴 Игра крашится при запуске:
- Проверьте логи в Xcode Console на наличие
NullReferenceExceptionилиMissingMethodException. - Убедитесь, что все ассеты (текстуры, звуки) имеют правильные настройки импорта для iOS.
- Проверьте логи в Xcode Console на наличие
- 🔴 Низкий FPS на устройстве:
- Используйте Unity Profiler, чтобы найти "бутылочные горлышки" (например, тяжелые шейдеры или скрипты в
Update()). - Для iPhone с чипом A12 и старше включите
Metal API Validationв Xcode (Edit Scheme → Diagnostics).
- Используйте Unity Profiler, чтобы найти "бутылочные горлышки" (например, тяжелые шейдеры или скрипты в
- 🔴 Ошибка ITMS-90125 (иконка неправильного размера):
- Apple требует иконки размером
1024×1024без альфа-канала. Проверьте настройки вPlayer Settings → iOS → Icons.
- Apple требует иконки размером
- 🔴 Не работает Game Center или IAP:
- Убедитесь, что в App Store Connect настроены In-App Purchases и Game Center для вашего App ID.
- Для тестирования IAP используйте Sandbox-аккаунты (
Settings → Users and Access → Sandbox Testers).
Критическая ошибка: если игра собирается, но не устанавливается на устройство с сообщением "Unable to install app" — проверьте, добавлен ли UDID вашего iPhone в Provisioning Profile. Также убедитесь, что на устройстве установлена последняя версия iOS (не бета!).
Что делать, если TestFlight не принимает билд?
Если загрузка в TestFlight зависает на этапе "Processing", попробуйте следующее:
1. Уменьшите размер билда (оптимизируйте текстуры, удалите ненужные ассеты).
2. Проверьте, что в Info.plist указаны все необходимые ключи (например, NSPhotoLibraryUsageDescription для доступа к фото).
3. Пересоберите проект в Unity с отключённым Burst Compiler (иногда он конфликтует с IL2CPP).
4. Если используете Firebase, обновите его до последней версии — старые версии могут вызывать ошибки линковки.
FAQ: Ответы на частые вопросы
Можно ли тестировать игру на iPhone без Apple Developer Account?
Нет, для установки игры на реальное устройство требуется Apple Developer Account (бесплатный или платный). Однако вы можете использовать эмулятор в Xcode для базового тестирования без аккаунта. Для публикации в TestFlight или App Store обязательна платная подписка ($99/год).
Как протестировать мультиплеерную игру на нескольких iPhone?
Для тестирования мультиплеера:
- Соберите билд и установите его на несколько устройств через Xcode или TestFlight.
- Используйте локальную сеть (Wi-Fi) или сервер для подключения. Для Unity подойдёт Mirror Networking или Photon Unity Networking.
- Если тестируете через интернет, убедитесь, что порты открыты (например,
TCP/UDP 5055для Photon).
Для эмуляции высокого пинга можно использовать инструменты вроде Network Link Conditioner (входит в Xcode).
Почему игра работает в Unity Editor, но крашится на iPhone?
Частые причины:
- 🔹 Несовместимость с IL2CPP: некоторые скрипты (например, с рефлексией) не работают в
IL2CPP. Проверьте логи на наличиеExecutionEngineException. - 🔹 Проблемы с шейдерами: Metal строже относится к синтаксису шейдеров. Используйте
Shader.WarmupAllShaders()вAwake()для предзагрузки. - 🔹 Нехватка памяти: на iPhone с 4 ГБ ОЗУ (например, iPhone 8) игра может крашиться при загрузке тяжёлых сцен. Оптимизируйте ассеты.
Для диагностики подключите iPhone к Xcode и посмотрите логи в реальном времени.
Как уменьшить размер билда для TestFlight?
Способы оптимизации:
- 📦 Текстуры: используйте сжатие
ASTC(для iOS) и уменьшайте разрешение до необходимого минимума. - 🎵 Звуки: конвертируйте в
.mp3или.oggс битрейтом 128–192 kbps. - 🗑️ Ненужные ассеты: удалите неиспользуемые префабы, материалы и анимации через
Assets → Right Click → Delete Unused Assets. - 🔧 Код: включите
Managed Code StrippingвPlayer Settings → Publishing Settings.
Целевой размер билда для TestFlight — менее 150 МБ. Если игра больше, рассмотрите возможность загрузки контента по требованию (Addressables).
Можно ли тестировать игру на iPhone через Windows?
Нет, для сборки и тестирования iOS-игр обязательно нужен Mac с установленными Xcode и Unity. Однако вы можете:
- 🖥️ Использовать Mac-мини или MacBook в облаке (например, MacStadium или AWS EC2 Mac Instances).
- 🔄 Настраивать проект на Windows, а сборку и тестирование делегировать коллеге с Mac.
- 📱 Тестировать геймплей на Android, а затем переносить изменения на iOS (но это не гарантирует отсутствие багов).
Unity не поддерживает кросс-платформенную сборку под iOS с Windows или Linux.