
Недавно я увидел новость об 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 я столкнулся с двумя ограничениями:
xtool пока не понимает файлы xcodeproj, а Tuist генерирует именно их
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-разработчиками. Пробуйте, тестируйте, изучайте - а я буду ждать ваши отзывы в комментариях!
Einherjar
xamarin/maui в visual studio умели это еще лет 5-6 назад, только в дебаге конечно, без возможности публикации. но всем как всегда пофиг.