Xtoolを使ってWSLでiOSアプリを開発する
Xtoolを使ってWSLでiOSアプリを開発する
はじめに
Xtoolというものを使えばLinux環境でもiOSの開発ができるというのを聞いたのでやってみました。
参考リンク
- Swift Forum「Xtool: cross-platform Xcode replacement. Build iOS apps on Linux and more!」
- GitHub「xtool-org/xtool」
- 公式サイト
注意
フォーラムにて規約違反の可能性が指摘されています。自己責任でお願いします。
1:環境構築 / 要件
以下が必要です:
- WSL2
- Swift
- Apple ID
以下の組み合わせのうち、いずれかが必要です:
- usbipd、usbmuxd
- AltStore Classic
- その他のサイドロード環境(Sideloadly、TrollStoreなど)
また、この記事内では以下の記法を用います:
$ -> WSL:一般ユーザーで実行
> -> Windows:一般ユーザーで実行
! -> Windows:Administratorで実行
<読み替え>(例:cat /home/<ユーザー名>/.ssh/id_ed25519)
執筆時の環境
- Windows 11
- WSL:Ubuntu 24.04.2 LTS x86_64
- usbmuxd:1.1.1
- xtool:1.11.0
- usbipd-win:5.0.0
2:Xtoolのセットアップ
- Xcode.xipをダウンロードします。
以下のURLからダウンロードできます。curl等でのダウンロードはできません(一敗)。
https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_16.3/Xcode_16.3.xip
この時、ダウンロード先のパスを覚えておく必要があります。これは1回しか使われないので、/tmp
でも大丈夫のはずです(要検証)。
また、念のためfile
コマンドでちゃんとダウンロードできているか確認することを推奨します。(現時点だとXtoolに無効なファイルを指定するとハングするバグがあるため)
$ file ~/xtool/xcode.xip
/home/sevenc7c/xtool/xcode.xip: xar archive compressed TOC: 3942, SHA-1 checksum
- Xtoolをインストールします。
$ curl -fL \
"https://github.com/xtool-org/xtool/releases/latest/download/xtool-$(uname -m).AppImage" \
-o ./xtool
$ chmod +x ./xtool
$ mv ./xtool ~/.local/bin/xtool # PATHが通っていればどこでも可
- Xtoolでログインします。
$ xtool setup
この時、APIキーを使ってログインするかパスワードを使ってログインするかを選ぶことができます:
Select login mode
0: API Key (requires paid Apple Developer Program membership)
1: Password (works with any Apple ID but uses private APIs)
Choice (0-1):
APIキーは有料のApple Developer Programに加入する必要があります。もし加入している場合はこちらを使うことが推奨されています。
加入していない場合はパスワードを選択する必要があります。
- Xcode.xipのパスを指定します。
Choice (0-1): 1
...
Path to Xcode.xip: <1.でダウンロードした先のパス>
その後、解凍されるまで放置すればセットアップは完了です。
3:アプリの作成
- プロジェクトを作成します。
$ xtool new Hello
Creating package: Hello
Creating Package.swift
Creating xtool.yml
Creating .gitignore
Creating .sourcekit-lsp/config.json
Creating Sources/Hello/HelloApp.swift
Creating Sources/Hello/ContentView.swift
Finished generating project Hello. Next steps:
- Enter the directory with `cd Hello`
- Build and run with `xtool dev`
Hello下にアプリが作成されているはずです。
$ cd Hello
-
xtool.yml
を編集します。
version: 1
-bundleID: com.example.hello
+bundleID: com.sevenc7c.hello
- 必要に応じてSources/Hello下を編集します。
4:アプリのインストール
usbipd + usbmuxdを使った場合
- USBでiPhone/iPad端末をPCに繋ぎます。
- 管理者権限でコマンドプロンプトを開きます。
- busidを取得します。
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
2-2 0b05:19af AURA LED Controller, USB 入力デバイス Not shared
2-3 046d:c077 USB 入力デバイス Not shared
2-11 1132:4511 USB 大容量記憶装置 Not shared
2-14 8087:0026 インテル(R) ワイヤレス Bluetooth(R) Not shared
6-3 046d:c31d USB 入力デバイス Not shared
6-4 05ac:12a8 Apple Mobile Device USB Composite Device Not shared
Persisted:
GUID DEVICE
Apple Mobile Device USB Composite DeviceのBUSIDを覚えておきます。
- WSL側にiPhone/iPadの管理を移譲します。
! usbipd bind --busid <busid>
! usbipd attach --wsl --busid <busid>
このとき、usbipd attach
がDevice busyで動かないときがあります:
WSL usbip: error: Attach Request for 6-4 failed - Device busy (exported)
その場合は以下のコマンドを連打しながら(上->Enterを繰り返す)USBをつなぎ直すとうまくいきます。
! usbipd bind --busid <busid> --force && usbipd attach --wsl --busid <busid>
もし正常にできていた場合は以下のコマンドでiPhone/iPadが出現するはずです:
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 006: ID 05ac:12a8 Apple, Inc. iPhone 5/5C/5S/6/SE/7/8/X/XR
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
-
xtool dev
を実行します。
$ xtool dev
が、自分の環境だと動きませんでした...(関連Issue)
サイドロード環境の場合
- ipaをビルドします。
$ xtool dev build --ipa
Planning...
Building for debugging...
[8/8] Linking Hello-App
Build of product 'Hello-App' complete! (8.22s)
Packaging...
Wrote to /home/sevenc7c/xtool/Hello/xtool/Hello.ipa
- ipaを端末にインストールします。
これは使っているサイドロードツールのドキュメントを参照してください。
うまく行けばアプリがサイドロードできているはずです。
終わりに
まだビルドしただけですが、ビルドできたということに大きな意義があると思います。
Xcodeでのプレビューなどが使えない以上、おそらく現実的なのはCapacitorなどのクロスプラットフォームなGUIライブラリを使うことになると思います。(まだCapacitorをXtoolで動かせていませんが...)
ありがとうございました。
Discussion