02
Сценарии, в которых требуется macOS и Xcode
Для сборки и публикации Flutter-приложения под iOS официальное руководство Flutter задаёт путь с использованием macOS и Xcode. Документация по настройке iOS также описывает запуск Flutter-приложения в симуляторе и на физическом устройстве через Xcode (настройка iOS для Flutter). Это требование относится к целевым iOS-операциям, а не ко всему написанию Dart-кода.
Xcode — не просто редактор исходников. В документации Apple его инструменты включены в процесс сборки, тестирования и распространения приложений для платформ Apple (описание распространения приложений с помощью Xcode). Однако из этого не следует, что Mac обязан находиться у разработчика на столе: важна доступная macOS-среда, а её форма зависит от задачи и регулярности работы.
Сборка без интерактивной отладки
Если нужен только автоматический запуск сборки, облачный CI может быть достаточным. Перед тем как полагаться на него, выясните по официальной документации конкретной платформы, поддерживает ли она нужные проекту macOS и Xcode, способ установки Flutter, работу с зависимостями и безопасную передачу секретов подписи. Затем проверьте маршрут на собственном проекте.
Не переносите выводы с одного сервиса на все остальные. Наличие у CI функции «сборка iOS» само по себе не подтверждает, что там заработают ваши плагины, версия инструментов, скрипты или процесс подписи. Документация Apple по Xcode Cloud, например, описывает отдельный сценарий распространения сборок через TestFlight; это не является подтверждением совместимости любого стороннего CI с конкретным Flutter-проектом (документация Apple о распространении сборок Xcode Cloud через TestFlight).
Облачную сборку разумно оставить основным способом, если она:
- принимает ваш проект с его реальными зависимостями;
- выполняет требуемые команды без ручного вмешательства;
- позволяет разбирать ошибки по доступным логам;
- надёжно получает данные для подписи без хранения секретов в репозитории;
- выдаёт артефакт, подходящий для следующего этапа распространения.
Если хотя бы один из пунктов не подтверждён пробным запуском, не считайте CI готовым решением только на основании списка возможностей сервиса.
Симулятор и физическое устройство
Симулятор, физический iPhone и удалённый рабочий стол решают разные задачи. Симулятор помогает проверить приложение в соответствующей программной среде. Физическое устройство нужно, если сценарий проверки зависит от реального оборудования или поведения приложения на нём. Удалённый рабочий стол лишь предоставляет доступ к Mac; он сам по себе не гарантирует соединение с вашим локальным телефоном, установку приложения на него или отладку через него.
Перед выбором удалённой среды проверьте весь маршрут, если тестирование на устройстве обязательно: каким образом устройство будет доступно, какие действия потребуют подтверждения на нём и можно ли получить нужные логи. Не делайте вывод «можно подключиться к удалённому Mac — значит, можно отлаживать любой iPhone» без проверки конкретной схемы. Требования к доступу и тестированию уточняйте на уровне выбранного способа работы.
Нативные плагины и ошибки платформенной сборки
Наличие плагина с нативной частью не означает, что все задачи Flutter-разработки надо перенести на Mac. Но если ошибка проявляется при сборке iOS-части, а диагностика требует открыть Xcode-проект, изучить интеграцию фреймворка или повторить платформенную конфигурацию, интерактивная macOS-среда заметно упрощает расследование.
Flutter документирует интеграцию с фреймворками Apple, но фактические требования зависят от конкретного плагина и его реализации (руководство Flutter по интеграции с фреймворками Apple). Поэтому не переносите единичное требование зависимости на все приложения. Для собственного плагина включите проверку iOS-части в процесс приёмки; для приложения, чьи зависимости уже стабильно проходят облачную сборку, постоянный интерактивный Mac может быть не нужен.