Сборка и запуск Unity-проекта на iOS: полное руководство для разработчиков

Запуск Unity-проекта на iOS-устройстве — критически важный этап для любого разработчика мобильных игр. Даже если ваш проект идеально работает в редакторе, сборка под iPhone или iPad может столкнуться с десятками нюансов: от ошибок сертификатов до проблем с архитектурой процессора. Эта статья покрывает все актуальные шаги для Unity 2022–2026 и iOS 15–17, включая настройку окружения, экспорт проекта, работу с Xcode и тестирование на реальном устройстве.

Многие начинающие разработчики теряют часы на поиск решений типичных ошибок вроде ITMS-90087 (неверная архитектура) или Provisioning profile not found. Мы разберём не только базовые шаги, но и скрытые настройки Unity, которые влияют на производительность игры на Apple Silicon (M1/M2), а также дадим чек-лист для диагностики самых распространённых проблем. Если вы никогда раньше не собирали проект под iOS — эта инструкция станет вашим гидом от нуля до работающего .ipa-файла.

1. Подготовка окружения: что нужно установить до сборки

Прежде чем приступать к сборке, убедитесь, что ваш компьютер соответствует минимальным требованиям Apple для разработки под iOS. Вот обязательный набор инструментов:

  • 🖥️ Mac с macOS 12 Monterey или новее (для поддержки последних версий Xcode и iOS SDK). Виртуальные машины на Windows не подходят!
  • 📱 iPhone/iPad с iOS 15+ (для тестирования). Устройство должно быть разблокировано для разработки (см. раздел про UDID).
  • 🛠️ Xcode 14.3+ (скачать бесплатно в Mac App Store). Включает iOS SDK, симулятор и инструменты командной строки.
  • 🔑 Apple Developer Account (99$/год для публикации в App Store, бесплатно для тестирования на 3 устройствах).
  • 🎮 Unity 2022.3 LTS или 2023.2+ (рекомендуемые версии с поддержкой Metal API и Apple Silicon).

Особое внимание уделите версии Unity: например, в Unity 2021.3 есть баги с ARKit на iOS 16, а в Unity 2023.1 добавлена поддержка Dynamic Islands для iPhone 14 Pro. Проверьте официальные заметки о релизах, если используете специфические функции.

📊 Какую версию Unity вы используете для iOS-разработки?
2022.3 LTS
2023.2+
2021.3
Другую
Не знаю

Критическая ошибка новичков: многие забывают обновить Xcode Command Line Tools после установки новой версии Xcode. Это приводит к ошибкам сборки вроде clang: error: no such file or directory. Чтобы обновить инструменты, выполните в Terminal:

xcode-select --install

sudo xcodebuild -reset

2. Настройка Unity-проекта для iOS

Переключите платформу сборки в Unity на iOS через меню File → Build Settings. Здесь есть несколько ключевых параметров, которые часто упускают:

  • 📱 Target Device: выберите iPhone + iPad, если ваша игра универсальна, или iPhone only для экономии места (важно для игр с тяжелой графикой).
  • 🔧 Architecture: ARM64 — обязательный параметр для iOS 11+. Отметьте также ARMv7, если поддерживаете старые устройства (например, iPhone 5s).
  • 🎨 Graphics APIs: оставьте только Metal (устаревший OpenGLES не поддерживается в новых версиях iOS).
  • 🔒 Signing Team ID: укажите ваш Apple Developer Team ID (найти можно в Apple Developer AccountMembership).

☑️ Проверка настроек Unity перед сборкой

Выполнено: 0 / 5

Обратите внимание на Bundle Identifier (например, com.yourcompany.gamename). Он должен быть уникальным и совпадать с тем, что указан в Apple Developer Account. Если вы тестируете на реальном устройстве, добавьте его UDID в профиль провижининга (Provisioning Profile). Узнать UDID можно через iTunes или специальные сервисы вроде UDID.io.

⚠️ Внимание: Если вы используете плагины (например, Firebase или Unity IAP), убедитесь, что они совместимы с выбранной версией Unity и iOS. Например, Unity IAP 4.0+ требует iOS 12+ и может конфликтовать с StoreKit 2 в iOS 16.

3. Экспорт проекта из Unity в Xcode

После настройки параметров нажмите Build в Build Settings и выберите папку для экспорта (например, /Builds/iOS). Unity сгенерирует .xcodeproj-файл, который нужно открыть в Xcode. Этот процесс может занять несколько минут — не прерывайте его!

Вот что происходит "под капотом" во время экспорта:

  1. Unity компилирует скрипты в .dll-файлы (для IL2CPP или Mono).
  2. Генерируются нативные библиотеки для iOS (например, libil2cpp.a для IL2CPP).
  3. Создаются ресурсы для Asset Catalog (иконки, сплайш-скрины).
  4. Формируется структура проекта Xcode с настройками сборки.

Если экспорт заканчивается ошибкой, проверьте:

  • 📁 Достаточно ли места на диске (требуется минимум 5–10 ГБ для временных файлов).
  • 🔄 Права доступа к папке (иногда macOS блокирует запись в /Applications).
  • 🐞 Логи ошибок в ConsoleUnity включите Open Editor Log в меню Console).

4. Работа в Xcode: сертификаты, провижининг и сборка

Откройте сгенерированный .xcodeproj в Xcode. Здесь вам предстоит настроить:

  1. Signing & Capabilities:
    • Выберите ваш Apple Developer Account в поле Team.
    • Убедитесь, что Bundle Identifier совпадает с тем, что в Unity.
    • Если используете Game Center или In-App Purchases, добавьте соответствующие Capabilities.
  • Build Settings:
    • Проверьте, что Enable Bitcode выключен (Unity не поддерживает Bitcode).
    • Для IL2CPP установите C++ Standard Library = libc++ (LLVM).
    • Если целевое устройство — iPhone 15 Pro, включите ARM64_32 для поддержки Dynamic Island.
    • Самая частая ошибка на этом этапе — Provisioning profile not found. Решается так:

      1. Перейдите в Apple Developer AccountCertificates, Identifiers & Profiles.
      2. Создайте новый App ID с вашим Bundle Identifier.
      3. Сгенерируйте Development Provisioning Profile и скачайте его.
      4. В Xcode нажмите Download All Profiles в Preferences → Accounts.

    После настройки подключите iPhone к Mac через USB-C (или Lightning для старых моделей) и выберите его в качестве целевого устройства в Xcode. Нажмите Build (или ⌘ + B). Если всё настроено правильно, проект скомпилируется и установится на устройство.

    Что делать если Xcode не видит подключённый iPhone?

    1. Проверьте кабель — используйте оригинальный от Apple (дешёвые кабели часто не передают данные).

    2. Разблокируйте телефон и подтвердите доверие компьютеру ("Trust This Computer").

    3. Перезапустите usbmuxd в Terminal:

    sudo killall -9 usbmuxd

    4. Обновите iTunes (да, даже если вы им не пользуетесь — он содержит драйвера для устройств).

    5. Решение типичных ошибок сборки

    Даже опытные разработчики сталкиваются с ошибками при первой сборке. Вот таблица самых распространённых проблем и их решений:

    Ошибка Причина Решение
    ITMS-90087: Unsupported Architectures Включена архитектура i386 или x86_64 для симулятора. В Unity отключите Simulator Architectures в Player Settings → Other Settings.
    Library not found for -lGoogleMobileAds Отсутствует фреймворк Google Mobile Ads. Скачайте последнюю версию GoogleMobileAds и добавьте в Frameworks в Xcode.
    Failed to load 'Data/Managed/Metadata/global-metadata.dat' Проблема с IL2CPP при сборке для Apple Silicon. Установите Rosetta 2 для Unity Editor или обновите до Unity 2023.1+.
    Signing for "Unity-iPhone" requires a development team Не выбран Team ID в Xcode. Перейдите в Signing & Capabilities и выберите ваш Apple Developer Team.
    Thread 1: EXC_BAD_ACCESS (code=1) Проблема с памятью в нативном коде (часто после обновления Unity). Отключите Burst Compiler и пересоберите проект.

    Если вы видите ошибку, которой нет в таблице, проверьте логи в Xcode (View → Debug Area → Activate Console) и поищите решение на официальном форуме Unity или Apple Developer Forums. Часто помогает очистка кэша Unity и Xcode:

    # Очистка кэша Unity (в Terminal)
    

    rm -rf ~/Library/Caches/Unity/

    rm -rf ~/Library/Logs/Unity/

    Очистка derived data Xcode

    rm -rf ~/Library/Developer/Xcode/DerivedData/

    6. Оптимизация производительности для iOS-устройств

    Запуск игры на iPhone — это только половина дела. Чтобы игра работала плавно, нужно оптимизировать её под железо Apple. Вот ключевые рекомендации:

    • 🎮 Целевая частота кадров: Для большинства игр достаточно 60 FPS, но на iPhone 15 Pro можно тестировать 120 FPS (требует ProMotion поддержки).
    • 🖼️ Разрешение текстур: Используйте ASTC компрессию для текстур (поддерживается всеми устройствами на Apple A9 и новее).
    • 🔋 Thermal Throttling: На iPhone с Apple A12 и старше ограничьте нагрузку на CPU/GPU, чтобы избежать перегрева (используйте Application.targetFrameRate = 30 для тяжелых сцен).
    • 📡 Metal API: Отключите Multithreaded Rendering в Player Settings, если наблюдаете артефакты графики.
    • Для тестирования производительности используйте Xcode Instruments:

      1. Подключите устройство и запустите игру через Xcode.
      2. Выберите Product → Profile (или нажмите ⌘ + I).
      3. Запустите Time Profiler для анализа нагрузки на CPU или Metal System Trace для GPU.

      Особое внимание уделите устройствам с Apple Silicon (M1/M2): они эмулируют ARM64 через Rosetta 2, что может искажать результаты тестов. Для точных замеров используйте реальные iPhone с чипами A15 Bionic и новее.

      7. Тестирование на реальном устройстве vs симулятор

      Многие разработчики тестируют игры только в Xcode Simulator, но это грубая ошибка. Симулятор не учитывает:

      • 🔋 Реальное потребление батареи (в симуляторе всегда "100%").
      • 📶 Работу сенсоров (Gyroscope, Accelerometer).
      • 🎵 Производительность Audio (в симуляторе нет аппаратного ускорения звука).
      • 📡 Сетевые запросы (симулятор использует Wi-Fi Mac, а не мобильную сеть).

      Минимальный набор устройств для тестирования:

      Устройство Чип Зачем нужно
      iPhone SE (2nd gen) Apple A13 Тестирование на слабом железе (минимальные требования).
      iPhone 12 Apple A14 Средний сегмент (60% пользователей).
      iPhone 15 Pro Apple A17 Pro Максимальная производительность и поддержка новых фич (Dynamic Island, Ray Tracing).
      iPad Pro (M2) Apple M2 Тестирование масштабирования интерфейса и многозадачности.

      Если у вас нет всех этих устройств, используйте TestFlight для удалённого тестирования. Это бесплатный сервис от Apple, который позволяет раздавать билды до 10 000 тестеров. Чтобы загрузить билд в TestFlight:

      1. В Xcode выберите Generic iOS Device как цель.
      2. Нажмите Product → Archive.
      3. В открывшемся окне нажмите Distribute App → TestFlight.
      4. Заполните метаданные (скриншоты, описание) и загрузите.

      8. Публикация в App Store: финальные шаги

      Когда игра готова, остаётся опубликовать её в App Store. Вот краткий чек-лист:

      1. Подготовка метаданных:
        • Создайте запись в App Store Connect.
        • Загрузите скриншоты для всех поддерживаемых разрешений (от iPhone SE до iPhone 15 Pro Max).
        • Напишите описание на всех целевых языках (используйте Google Translate осторожно — модераторы Apple проверяют качество переводов).
      2. Сборка для релиза:
        • В Unity переключитесь на Release сборку в Build Settings.
        • В Xcode установите Build Configuration = Release.
        • Отключите отладочные логи (Debug.Log) с помощью директивы #if UNITY_EDITOR.
    • Загрузка в App Store:
      • Архивируйте проект в Xcode (Product → Archive).
      • Выберите Distribute App → App Store Connect.
      • Заполните информацию о версии и отправьте на ревью.

      Срок модерации в App Store — от 24 часов до 3 дней. Частые причины отклонения:

      • 📄 Отсутствие политики конфиденциальности (обязательна даже для бесплатных игр).
      • 🎮 Баги, которые проявляются только на устройствах Apple (например, падения при переключении на фоновый режим).
      • 💰 Неправильная настройка In-App Purchases (цены должны совпадать с указанными в App Store Connect).

      После одобрения вы можете выпустить игру вручную или настроить автоматический релиз. Не забывайте обновлять сборку каждые 2–3 месяца — Apple требует поддержки последних версий iOS для актуальности в магазине.

      FAQ: Частые вопросы по сборке Unity под iOS

      ❓ Почему Unity не видит Xcode при сборке?

      Это происходит, если путь к Xcode не настроен в командной строке. Исправляется командой:

      sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

      После этого перезапустите Unity.

      ❓ Можно ли собирать iOS-проекты на Windows?

      Нет, Apple требует macOS для разработки под iOS. Альтернативы:

      • Использовать Mac mini в аренде (сервисы вроде MacinCloud).
      • Установить macOS на VMware или Parallels (неофициально, могут быть проблемы с лицензией).
      • Купить подержанный MacBook (например, MacBook Pro 2017 вполне подходит для сборки).
      ❓ Как уменьшить размер .ipa-файла?

      Оптимизируйте сборку так:

      • Включите Compression в Player Settings → Publishing Settings.
      • Используйте Addressables для загрузки тяжелых ассетов по требованию.
      • Отключите ненужные модули в Player Settings → Other Settings → Scripting Define Symbols.
      • Сожмите текстуры в ASTC (вместо PNG или JPG).

      Целевой размер для казуальной игры — до 150 МБ, для AAA-проектов — до 1 ГБ (но учитывайте ограничения App Store на загрузку по мобильной сети).

      ❓ Почему игра лагает на iPhone, но нормально работает в Unity Editor?

      Возможные причины:

      • Отсутствует оптимизация под Metal: В редакторе по умолчанию используется OpenGLCore, а на iOS — Metal. Проверьте шейдеры на совместимость.
      • Слишком много GameObject: На мобильных устройствах рекомендуется не более 500 активных объектов на сцену.
      • Не оптимизированные скрипты: Используйте Object Pooling вместо Instantiate/Destroy.
      • Перегрев процессора: Ограничьте FPS до 30 или 60 в Application.targetFrameRate.

      Для диагностики используйте Xcode Instruments (раздел Time Profiler).

      ❓ Как тестировать In-App Purchases без публикации в App Store?

      Apple предоставляет Sandbox-режим для тестирования покупок:

      1. Создайте In-App Purchase в App Store Connect (статус Ready to Submit).
      2. В Xcode используйте TestFlight или сборку через Development Provisioning Profile.
      3. Создайте тестового пользователя в App Store Connect (Users and Access → Sandbox Testers).
      4. Войдите под тестовым аккаунтом на устройстве и протестируйте покупки (они не списывают реальные деньги).

      Обратите внимание: Sandbox-покупки обрабатываются медленнее, чем реальные (это нормально).