Создание кроссплатформенных приложений на Flutter позволяет разрабатывать одновременно под Android и iOS, но сборка под Apple-экосистему имеет свои нюансы. Если с Android всё сводится к генерации APK/AAB, то для iOS требуется работа с Xcode, сертификатами разработчика и профилями provisioning. Без правильной настройки этих компонентов вы получите ошибки при архивировании или загрузке в App Store Connect.
Эта статья покрывает весь процесс: от подготовки среды до финальной сборки .ipa-файла. Мы разберём обязательные шаги для macOS (без неё сборка под iOS невозможна), настройку Flutter-проекта, генерацию сертификатов через Apple Developer Account, а также решения типичных ошибок. Особое внимание уделим требованиям App Store 2026 года — например, обязательной поддержке iOS 15+ и архитектуры arm64.
Если вы впервые компилируете под iOS, запаситесь терпением: процесс может занять от 30 минут до нескольких часов в зависимости от скорости интернета (скачивание Xcode весит ~12 ГБ) и опыта работы с Apple-инструментами. Готовы начать? Первым делом проверьте, что у вас есть аккаунт разработчика Apple (стоимость — $99/год) и Mac с macOS Monterey или новее.
1. Подготовка среды разработки на macOS
Без macOS скомпилировать приложение под iOS невозможно — это жёсткое требование Apple. Даже если вы разрабатываете на Windows или Linux, для финальной сборки потребуется Mac (или облачный сервис вроде MacStadium). Минимальные требования к машине:
- 🖥️ Mac с чипом Apple Silicon (M1/M2) или Intel (2018 года и новее)
- 🍎 macOS Ventura 13.0 или выше (рекомендуется Sonoma 14.0)
- 📦 20 ГБ свободного места на диске (для Xcode + симуляторов)
- 🔌 Стабильное интернет-соединение (скачивание Xcode и зависимостей)
Первым делом обновите систему через Системные настройки → Обновление ПО. Затем установите Xcode из App Store (бесплатно). После установки откройте Xcode и дождитесь завершения пост-настройки (может занять 5–10 минут). Важно: не пропускайте этот шаг — иначе Flutter не сможет найти инструменты сборки.
Далее установите командные инструменты Xcode через терминал:
xcode-select --install
И проверьте лицензионное соглашение (без этого сборка не запустится):
sudo xcodebuild -license accept
2. Настройка Flutter-проекта для iOS
Если проект уже создан, перейдите в его корневую папку. Если нет — инициализируйте новый:
flutter create my_ios_app
cd my_ios_app
Проверьте поддержку iOS в проекте:
flutter doctor
В выводе должен быть зелёный чек напротив [✓] iOS toolchain. Если его нет, выполните:
flutter config --enable-ios
Теперь откройте iOS-модуль проекта в Xcode. Для этого в терминале выполните:
open ios/Runner.xcworkspace
Важно: открывайте именно .xcworkspace, а не .xcodeproj — иначе не подгрузятся зависимости от CocoaPods.
В Xcode проверьте:
- 📱 Bundle Identifier (вкладка
General → Identity) — должен быть уникальным (например,com.yourcompany.appname) - 🔢 Version и Build (те же настройки) — должны соответствовать правилам App Store (формат
1.0.0и1соответственно) - 📱 Deployment Target (вкладка
General → Minimum Deployments) — не нижеiOS 15.0(требование App Store с 2026 года)
Установить Xcode из App Store|Принять лицензионное соглашение|Проверить flutter doctor|Открыть Runner.xcworkspace в Xcode|Настроить Bundle Identifier и версии-->
3. Генерация сертификатов и профилей provisioning
Это самый сложный этап для новичков. Без правильных сертификатов Xcode не сможет подписать приложение, а App Store не примет его. Вам понадобятся:
- 🔑 Development Certificate — для отладки на устройствах
- 🔑 Distribution Certificate — для релизной сборки
- 📄 App ID — уникальный идентификатор приложения
- 🛡️ Provisioning Profile — связывает сертификат, App ID и устройства
Перейдите на сайт Apple Developer Account и выполните шаги:
- Создайте App ID:
- Перейдите в
Certificates, Identifiers & Profiles → Identifiers - Нажмите
+и выберитеApp IDs - Укажите Description (название) и Bundle ID (должен совпадать с тем, что в Xcode)
- Включите нужные Capabilities (например,
Push Notifications,Sign In with Apple)
- Перейдите в
- Сгенерируйте сертификаты:
- В разделе
Certificatesнажмите+и выберите тип сертификата (Apple DevelopmentилиApple Distribution) - Следуйте инструкциям на сайте — потребуется создать
Certificate Signing Request (CSR)через Keychain Access на Mac - Скачайте сертификат и установите его двойным кликом (он появится в Keychain Access)
- В разделе
- В разделе
Profilesнажмите+и выберите тип профиля (App Storeдля релиза) - Привяжите профиль к App ID и сертификату
- Для
Development-профиля добавьте UDID тестовых устройств - Скачайте профиль и перетащите его в Xcode (или в папку проекта)
Что делать, если Xcode не видит профили?
Если после скачивания профилей Xcode их не отображает, попробуйте:
1. Перезапустить Xcode.
2. Вручную перетащить файлы .mobileprovision в папку ~/Library/MobileDevice/Provisioning Profiles/.
3. Проверить, что Bundle Identifier в проекте совпадает с App ID в профиле.
4. Обновить Xcode до последней версии (баги с профилями часто исправляют в новых релизах).
4. Настройка сборки в Xcode
Теперь, когда сертификаты и профили на месте, вернёмся к Xcode. В верхней панели выберите целевое устройство (Any iOS Device для релизной сборки) и схему (Runner). Затем:
- Выберите команду сборки:
- Для отладки:
Product → Archive(но предварительно подключите физическое устройство или выберите симулятор) - Для релиза:
Product → Archive(соберёт.ipaдля App Store)
- Для отладки:
- Настройте схему подписи:
- Откройте
Runner → Signing & Capabilities - В поле
Teamвыберите ваш Apple Developer Account - Убедитесь, что
Bundle Identifierсовпадает с App ID из профиля - В разделе
Provisioning Profileвыберите ранее созданный профиль
- Откройте
- Перейдите во вкладку
Build Settings - Найдите
Code Signing Identityи выберите соответствующий сертификат (Apple Distributionдля релиза) - Убедитесь, что
Enable Bitcodeустановлен вNo(требование Flutter)
Если всё настроено правильно, при нажатии Product → Archive Xcode начнёт сборку. Процесс может занять от 1 до 10 минут в зависимости от сложности проекта. По завершении откроется окно Organizer, где вы сможете просмотреть архив и загрузить его в App Store Connect.
5. Сборка и экспорт .ipa-файла
После успешной архивации в Xcode Organizer вы увидите список архивов. Выберите последний и нажмите Distribute App. Далее следуйте шагам мастера:
- Выберите метод распространения:
- 📱
App Store Connect— для загрузки в магазин - 📦
Ad Hoc— для тестирования на ограниченном числе устройств - 🔗
Development— для отладки - 💾
Enterprise— для внутреннего распространения (требует Enterprise Account)
- 📱
- Настройте параметры экспорта:
- Для App Store выберите
Automatic signing(если профили настроены правильно) - Укажите
App Store Connect API key(если используетеfastlaneили CI/CD) - Проверьте, что
Rebuild from Bitcodeотключён (если используется Flutter)
- Для App Store выберите
- Нажмите
Exportи сохраните файл в удобное место - Для App Store дождитесь завершения загрузки в App Store Connect
Критическая деталь: если вы используете плагины с нативным кодом (например, firebase_messaging или google_sign_in), убедитесь, что они поддерживают arm64-архитектуру. В 2026 году App Store отклоняет приложения, собранные без поддержки 64-битных процессоров.
После экспорта вы получите файл app.ipa, который можно:
- 📤 Загрузить в App Store Connect через Transporter или Xcode
- 📱 Установить на тестовые устройства через TestFlight или Diawi
- 🔍 Проанализировать на ошибки через
flutter analyze
6. Загрузка в App Store Connect и публикация
Перед загрузкой в App Store убедитесь, что:
- 📋 В App Store Connect создано приложение с тем же Bundle ID, что и в проекте
- 📸 Загружены все необходимые скриншоты (для всех поддерживаемых устройств и локализаций)
- 📝 Заполнено описание, ключевые слова и контактная информация
- 🔞 Указан возрастной рейтинг (требуется для всех приложений)
- 💳 Настроена цена и доступность (даже для бесплатных приложений)
Для загрузки архива:
- Откройте App Store Connect и перейдите в раздел
Мое приложение → [Ваше приложение] → TestFlight / App Store - Нажмите
+рядом сСборкии выберите загруженный архив - Дождитесь обработки (может занять до 30 минут)
- После проверки нажмите
Отправить на ревью
Среднее время модерации в App Store — 24–48 часов, но в пиковые периоды (например, перед праздниками) может растянуться до 3–5 дней. Частые причины отклонения:
- 🚫 Отсутствие поддержки
iOS 15+(проверьте вInfo.plist) - 🚫 Несоответствие скриншотов реальному интерфейсу
- 🚫 Отсутствие политики конфиденциальности (обязательно для всех приложений)
- 🚫 Использование недокументированных API (проверяется автоматически)
Как ускорить модерацию в App Store?
1. Загружайте сборку в рабочие дни (среда–четверг) — в выходные модерация медленнее.
2. Указывайте подробные заметки для ревьюера (как воспроизвести ключевые функции, логин/пароль для тестового аккаунта).
3. Проверяйте приложение на реальных устройствах (симулятор не всегда показывает все баги).
4. Если приложение отклонено, исправляйте все указанные ошибки перед повторной загрузкой.
7. Решение типичных ошибок при сборке
Даже у опытных разработчиков сборка под iOS часто сопровождается ошибками. Вот самые распространённые и способы их исправления:
| Ошибка | Причина | Решение |
|---|---|---|
No valid 'aps-environment' entitlement string found |
Отсутствует поддержка Push Notifications в профиле | Создайте новый Provisioning Profile с включёнными уведомлениями |
Provisioning profile "..." doesn't include signing certificate |
Сертификат не связан с профилем | Проверьте, что сертификат и профиль созданы для одного Team ID |
Failed to create provisioning profile. No devices registered |
Для Development-профиля не добавлены устройства |
Добавьте UDID устройств в Apple Developer Account |
The executable was signed with invalid entitlements |
Несовпадение Bundle ID в проекте и профиле | Исправьте Bundle Identifier в Xcode и пересоберите профиль |
ITMS-90087: Unsupported Architectures. The executable contains unsupported architecture '[x86_64]' |
В сборке остались симуляторные архитектуры | Добавьте в Podfile строку installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" end end |
Если ошибка не из таблицы, попробуйте:
- Очистить проект в Xcode:
Product → Clean Build Folder - Удалить папку
ios/Pods/и выполнитьpod installзаново - Обновить Flutter и плагины:
flutter upgrade+flutter pub upgrade - Проверьте логи сборки в Xcode (вкладка
Report Navigator)
8. Автоматизация сборки с помощью CI/CD
Если вы планируете часто обновлять приложение, ручная сборка через Xcode станет утомительной. Для автоматизации используйте CI/CD-сервисы:
- 🤖 GitHub Actions — бесплатно для публичных репозиториев
- 🔄 Bitrise — специализирован для мобильной разработки
- 🚀 Codemagic — оптимизирован под Flutter
- 🌐 Fastlane — инструмент для автоматизации загрузки в App Store
Пример конфигурации для GitHub Actions (.github/workflows/ios_build.yml):
name: iOS Build and Deploy
on:
push:
branches: [ main ]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.13.0'
- run: flutter pub get
- run: cd ios && pod install --repo-update
- run: flutter build ios --release --no-codesign
- run: xcodebuild -workspace ios/Runner.xcworkspace -scheme Runner -configuration Release archive -archivePath $PWD/build/Runner.xcarchive
- run: xcodebuild -exportArchive -archivePath $PWD/build/Runner.xcarchive -exportOptionsPlist ios/ExportOptions.plist -exportPath $PWD/build
Для Fastlane создайте файл Fastfile в папке ios:
default_platform(:ios)
platform :ios do
desc "Build and upload to App Store Connect"
lane :beta do
build_app(
scheme: "Runner",
export_method: "app-store",
output_name: "app_#{Time.now.strftime('%Y%m%d')}.ipa"
)
upload_to_app_store
end
end
Преимущества CI/CD:
- ⏱️ Сборка запускается автоматически при каждом коммите
- 🔍 Тесты и линтинг выполняются до сборки
- 📦 Автоматическая загрузка в TestFlight или App Store
- 📊 Логи сборки сохраняются для анализа
FAQ: Частые вопросы по сборке Flutter под iOS
❓ Можно ли скомпилировать Flutter под iOS на Windows?
Нет, для сборки под iOS обязательно нужна macOS. Вы можете разрабатывать код на Windows или Linux, но финальную компиляцию придётся делать на Mac (или использовать облачные сервисы вроде MacStadium или Codemagic).
❓ Почему Xcode не видит моё физическое устройство?
Проверьте следующее:
- Устройство подключено по USB (не по Wi-Fi)
- На устройстве включён режим
Разработчика(Настройки → Конфиденциальность → Разработчик) - В Xcode устройство отображается в меню
Window → Devices and Simulators - На Mac установлены последние обновления macOS и Xcode
Если проблема остаётся, попробуйте перезагрузить устройство и Mac.
❓ Как уменьшить размер .ipa-файла?
Вот несколько способов:
- Используйте
--obfuscateи--split-debug-infoпри сборке - Удалите ненужные локализации (оставьте только поддерживаемые языки)
- Оптимизируйте изображения (используйте
flutter_image_compress) - Исключите ненужные плагины (проверьте
pubspec.yaml) - Включите
tree shakingвbuild.yaml
Также можно проанализировать размер пакета с помощью flutter build ios --analyze-size.
❓ Почему App Store отклоняет моё приложение?
Частые причины отклонения:
- 📱 Не поддерживается
iOS 15+(проверьте вInfo.plist) - 📋 Отсутствует политика конфиденциальности (обязательна даже для бесплатных приложений)
- 🔗 Ссылки на внешние платежи (нарушение правил App Store)
- 📸 Скриншоты не соответствуют реальному интерфейсу
- 🔍 Приложение крашится на устройствах Apple (проверьте на реальных iPhone/iPad)
Подробные причины отклонения приходят на email, привязанный к App Store Connect.
❓ Как протестировать приложение на реальном устройстве без App Store?
Есть несколько способов:
- 📱 TestFlight — до 10 000 тестеров, требует модерацию Apple
- 📦 Ad Hoc — до 100 устройств, нужно добавить их UDID в профиль
- 🔗 Diawi или InstallOnAir — загрузка
.ipaпо ссылке (требует сертификат Enterprise или Development) - 💻 AltStore — альтернативный магазин (требует Mac для установки)
Для Ad Hoc используйте команду:
flutter build ios --release --export-method ad-hoc