Разработка под iOS без макбука с помощью утилиты Builder
Каждый, кто пробовал писать мобильные приложения на Flutter или React Native, сидя на Linux или Windows, неизбежно упирался в железную стену Apple. Собрать билд под Android можно за пару минут локально, а вот для iOS всегда нужен Mac с установленным Xcode. Покупка Mac mini ради сборки тестового артефакта два раза в неделю выглядит сомнительным вложением, особенно для пет-проектов или небольших команд.
Недавно наткнулся на репозиторий ios-builder от команды MobAI. Это небольшая утилита на Go, которая берет на себя рутину: триггерит сборку в облаке GitHub Actions, забирает готовый IPA-файл и связывает локальный процесс разработки с реальным айфоном.

Как это устроено внутри
Идея лежит на поверхности, но здесь её довели до готового CLI-инструмента. Вместо того чтобы настраивать сложные пайплайны вручную, вы ставите утилиту builder, которая генерирует workflow-файл для GitHub Actions.
Схема работы выглядит так:
- Вы запускаете команду сборки в терминале.
- CLI отправляет код в ваш репозиторий и запускает раннер GitHub Actions на macOS.
- Xcode в облаке компилирует проект и пакует артефакт.
- Утилита скачивает готовый IPA в локальную папку
./dist/.
Получается, что платить за Mac не нужно, вы расходуете бесплатные минуты CI от GitHub. Правда, у бесплатных аккаунтов на macOS действует повышающий коэффициент x10. Из 2000 бесплатных минут в месяц на раннерах Mac останется около 200 минут. Это примерно 15-20 сборок. Для релизов и периодических тестов вполне хватит, но гонять CI на каждый коммит не выйдет.
Что умеет утилита
Инструмент рассчитан на работу с популярными кроссплатформенными стеками и нативными проектами.
- Автоматическое определение структуры проекта. Утилита понимает Flutter, чистый React Native, выгруженный Expo, Cordova/Ionic и нативные проекты на Swift.
- Управление подписью кода. Можно загрузить сертификаты и provisioning profiles прямо в секреты GitHub через команду
builder signing setup. - Горячая перезагрузка (Hot Reload). Самая полезная часть для тех, кто пишет на Flutter или React Native.
- Запуск на удаленном симуляторе. Через сервис MobAI можно потыкать собранное приложение в симуляторе прямо из браузера или десктопного клиента, хотя эта опция требует подписки Pro.
Настройка и первый запуск
Установка простая. На Windows можно скачать готовый бинарник со страницы релизов, а на Linux, WSL или macOS выполнить команду через терминал:
curl -sSL https://raw.githubusercontent.com/MobAI-App/ios-builder/main/install.sh | bash
Или собрать из исходников, если на машине уже стоит Go:
git clone https://github.com/MobAI-App/ios-builder.git
cd ios-builder
go build -o builder ./cmd/builder
После установки нужно авторизоваться в GitHub и инициализировать проект в корне репозитория:
builder auth github
cd your-ios-project
builder init
Команда builder init в интерактивном режиме создаст конфигурационный файл .github/workflows/ios-build.yml и локальный builder.json.
Пример содержимого builder.json:
{
"project": "MyApp",
"platform": "ios",
"github": {
"owner": "username",
"repo": "my-ios-app"
},
"ios": {
"path": "ios",
"scheme": "",
"signing": true
},
"mobai": {
"url": "http://localhost:8686",
"device_id": ""
},
"flutter": {
"watch": {
"dirs": ["lib"],
"patterns": [".dart"],
"ignore": [".g.dart", ".freezed.dart"],
"debounce": 100
}
}
}
Сборка запускается одной строкой:
builder ios build
Если сертификаты Apple Developer ещё не настроены, можно собрать неподписанный билд с флагом --unsigned.
Разработка с Hot Reload без macOS
Собрать IPA файл — это половина дела. Настоящая боль начинается, когда нужно быстро править интерфейс и логику. Пересобирать проект в CI ради каждой кнопки бессмысленно, потому что сборка занимает несколько минут.
Разработчики решили эту проблему интеграцией со своим приложением MobAI, которое связывает физический iPhone с компьютером по USB.
Сценарий для Flutter выглядит следующим образом:
- Вы подключаете iPhone к Windows или Linux ПК по кабелю.
- Собираете базовый IPA через
builder ios buildи устанавливаете его на устройство. - Запускаете режим разработки:
builder dev flutter
Утилита запускает watcher файлов в директории lib/. Когда вы меняете код на Dart и сохраняете файл, builder сам шлет сигнал на Hot Reload через flutter attach. При этом сгенерированные файлы вроде .freezed.dart и .g.dart игнорируются, чтобы не триггерить лишние перезагрузки.
Пересобирать приложение целиком через облако придется только тогда, когда вы трогаете нативный код: меняете Podfile, добавляете плагины со сложными нативными зависимостями или правите Swift-файлы.
Для React Native процесс практически такой же:
builder dev rn
Команда поднимет локальный сервер Metro, прокинет правильный порт и свяжет бандлер с запущенным на телефоне приложением. Если работаете внутри WSL2, в настройках MobAI нужно будет разрешить внешние подключения и указать сетевой адрес хостовой Windows-машины.
Подводные камни
Инструмент выглядит привлекательно, но к нему есть несколько практических вопросов:
При переподписи приложения на лету через бесплатный аккаунт Apple ID меняется Bundle ID (добавляется суффикс команды). Из-за этого могут отвалиться пуши или Sign in with Apple, если они завязаны на конкретный идентификатор.
Зависимость от сторонней утилиты MobAI. Сам CLI builder распространяется под свободной лицензией MIT и написан прозрачно. Однако часть функционала (установка на девайс, симуляторы) опирается на проприетарное приложение MobAI, где часть возможностей платная.
Лимиты GitHub Actions. Если вы работаете в активной фазе верстки нативного UI без фреймворков, бесплатные минуты на раннерах закончатся быстро.
Стоит ли пробовать
Если вы пишете на Flutter или React Native под Windows/Linux и вам изредка нужно проверить приложение на живом айфоне или собрать тестовую сборку для заказчика, ios-builder сэкономит много времени и нервов. Он избавляет от необходимости вручную писать YAML-файлы для GitHub Actions и настраивать скачивание артефактов.
Для крупных проектов с жесткими требованиями к безопасности сертификатов и сложным CI/CD пайплайном всё равно понадобится выделенный Mac. Но для инди-разработчиков и небольших команд это удобный обходной путь.
