Недавно я увидел новость об xtool — кроссплатформенной утилите, которая воспроизводит функции Xcode и работает не только на macOS, но и на Linux и Windows (через WSL). Это значит, что теперь можно разработать и затем запустить приложение на iPhone, ни разу не взаимодействуя с Mac или MacBook. Проект меня очень заинтересовал, и сегодня мы вместе посмотрим, что он умеет.

Сейчас xtool умеет собирать только проекты на SwiftPM, но автор уже написал, что в планах — добавить поддержку XCodeProj.

Сергей Гречишников

Android Developer в Новостройках @ Домклик

Как было раньше

Раньше трава была зеленее единственным способом компилировать приложения под iPhone была macOS - даже если вы использовали кроссплатформенные фреймворки вроде Kotlin Multiplatform или Flutter. Вы могли собирать их и под другие целевые платформы, например на Linux, но не под iPhone.

Что умеет xtool

xtool позволяет собрать и установить проект SwiftPM на iPhone. Кроме того, утилита позволяет работать с аккаунтом Apple Developer. Для этого вам всё ещё придётся скачать Xcode.xip, но macOS уже не понадобится.

Проверка на демопроекте

Установился xtool без каких‑либо проблем. Для тестирования я использовал новый Apple ID - сами авторы советуют брать аккаунт, который «не жалко».

Чтобы сгенерировать Hello World, можно использовать команду xtool new example. После того как я успешно запустил его на своём iPhone, решил попробовать проект посложнее. Ну и, конечно, выбрал самую новаторскую идею для приложения - список todo. Код можно посмотреть в репозитории.

После того как я написал код и поправил ошибку, связанную с багом в xtool (об этом позже), я с нетерпением выполнил команду xtool dev. Ожидалось, что ничего не заработает - в чудеса я уже давно перестал верить. Но проект не только собрался, но и установился на телефон. Все библиотеки, описанные в Package.swift, загрузились и скомпилировались без проблем.

srggrch@VERY-COOL-PC:~/hi/TodoApp$ xtool dev
йPlanning...
Building for debugging...
[92 / 93] TodoApp-App-product

Build complete! (5.61 secs)
Waiting for device to be connected...
Installing to device: iPhone (udid: 00008130-001E794C2E08121B)

[Unpacking app] 100%
[Preparing device] 100%
[Provisioning] 100%
[Signing] 100%
[Packaging] 100%
[Connecting] 100%
[Installing] 100%
[Verifying] 100%
Запущенное на телефоне приложение
Запущенное на телефоне приложение

Проблемы и ограничения

Во время работы над демопроектом я обнаружил проблему: при сборке на Linux и Swift 6.4+ не работали cross-import overlay. При компилировании предыдущих версий Swift используется другая конфигурация, где эта проблема уже исправлена. Я открыл в xtool PR с исправлением, и он уже влит - фикс попал в версию 1.23.0.

На момент написания статьи выложить приложение в App Store через xtool тоже не получится, хотя работа в этом направлении ведётся. Также пока нет поддержки симуляторов вне macOS.

В интернете также идёт спор о том, не противоречит ли использование этого проекта лицензионному соглашению - вероятно, противоречит:

You agree not to, install, use or run the Apple Software or Apple Services on any non-Apple-branded computer or device, or to enable others to do so.

Пункт 2.7 Xcode and Apple SDKs Agreement

Я не успел попробовать отладку проекта, зато успел собрать KMP-проект и проект на Tuist. KMP собрать можно, но для этого потребуется патчить компилятор. Другой проект на основе xtool - xcross, похоже, решает эту проблему. При попытке собрать проект с Tuist я столкнулся с двумя ограничениями:

  1. xtool пока не понимает файлы xcodeproj, а Tuist генерирует именно их

  2. Tuist, собранный под Linux, не умеет генерировать файлы xcodeproj

Как попробовать самому

Проект новый и развивается очень быстро, поэтому не буду повторять здесь инструкцию по установке - она уже хорошо описана в документации на сайте проекта. Вместо этого я расскажу о нескольких проблемах, с которыми столкнулся во время настройки утилиты.

VSCode и WSL

Сначала нужно установить официальный плагин WSL. Он позволяет без проблем открывать в Windows-версии файлы VSCode, которые находятся внутри WSL. Далее в терминале WSL в папке с вашим проектом выполните команду open . , чтобы открыть эту папку в проводнике. Затем в VSCode выполните WSL: Open Folder in WSL .

После этого установите плагин Swift, а весь остальной процесс описан в инструкции на сайте.

Пробрасываем iPhone в WSL

На сайте xtool способ с использованием USBIPD указан как основной для проброса подключённого iPhone в WSL. Однако у меня, как и у многих других пользователей, с этим способом возникали проблемы. В документации этот комментарий указывается в issue как альтернативный подход. Вот инструкция из оригинального комментария:

1. after installing iTunes from Windows Store -> connect to your iPhone
2. windows cmd: check WSL interface name
ipconfig
...
Ethernet adapter vEthernet (WSL (Hyper-V firewall))
...
IPv4 Address. . . . . . . . . . . : 172.22.32.1

3. powershell: add firewall rule (this is a one-time setup) 
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL (Hyper-V firewall))" -Action Allow

4. powershell: port forwarding
$myhost = $(wsl -- ip route list default `| awk '{print \$3}')
#or ipv4 adr (see #2) 
$myhost = 172.22.32.1
netsh interface portproxy set v4tov4 listenport=27015 connectaddress=127.0.0.1 connectport=27015 listenaddress=$myhost

5. WSL: check connection
export USBMUXD_SOCKET_ADDRESS="$(ip route list default | awk '{print $3}'):27015"
ideviceinfo

6. WSL: build & install app
   xtool dev

Однако если в вашей WSL команда wslinfo --networking-mode отдаёт результат mirrored, то вы можете пропустить пункты 3 и 4, а вместо пункта 5 выполнить следующие команды:

export USBMUXD_SOCKET_ADDRESS="127.0.0.1:27015"
ideviceinfo
xtool devices

В моём случае ideviceinfo почему-то выдаёт ошибку ERROR: No device found!, а xtool devices выводит устройство, и дальнейшая сборка работает. Чтобы не вводить export USBMUXD_SOCKET_ADDRESS="127.0.0.1:27015" в каждой новой сессии терминала, можно добавить эту строку в .bashrc или другой аналогичный файл, который загружается в начале сессии.

Альтернативы

Примечание: я не тестировал работоспособность упомянутых ниже инструментов.

xcross

Позволяет запускать и устанавливать на iOS приложения, написанные на Flutter и Compose Multiplatform. Судя по описанию, для этого проекта WSL не нужен.

omarchy-apple-dev

Набор скриптов для сборки SwiftUI-приложений на Omarchy Linux с использованием xtool. Проект обещает отладку с LLDB, а под капотом использует знакомый нам xtool. Однако проект совсем свежий: на момент публикации первый релиз вышел меньше недели назад.

Вывод

Какая статья без вывода. Мне сложно быть полностью объективным - у меня, что называется, радости полные штаны. Теперь я смогу дома делать хобби-проекты под iOS, а возможно, даже собрать какой-то мини-CI без macOS. При этом я и не профессиональный iOS-разработчик: у меня небольшой опыт, и пара моих фич даже у нас в эксплуатации. Но основная моя работа - Android, а iOS для меня скорее дело для души.

Утилита в текущем виде, конечно, не является «убийцей» Xcode и вряд ли заинтересует компании. Но для разработчиков, которые в рамках хобби и личных проектов хотят делать прототипы или просто изучать новую платформу без покупки новой техники, это огромный шаг вперёд.

С интересом буду наблюдать за развитием проекта и ждать появления возможности публиковать приложения в App Store, а также запуска симуляторов.

Я давно ждал момента, когда можно будет хотя бы частично слезть с «иглы одобрения» Apple. Финальную оценку, впрочем, я оставлю за iOS-разработчиками. Пробуйте, тестируйте, изучайте - а я буду ждать ваши отзывы в комментариях!

Комментарии (1)


  1. Einherjar
    05.11.2026 08:21

    Раньше трава была зеленее единственным способом компилировать приложения под iPhone была macOS - даже если вы использовали кроссплатформенные фреймворки вроде Kotlin Multiplatform или Flutter. Вы могли собирать их и под другие целевые платформы, например на Linux, но не под iPhone.

    xamarin/maui в visual studio умели это еще лет 5-6 назад, только в дебаге конечно, без возможности публикации. но всем как всегда пофиг.