🍏

Xtoolを使ってWSLでiOSアプリを開発する

に公開

Xtoolを使ってWSLでiOSアプリを開発する

はじめに

Xtoolというものを使えばLinux環境でもiOSの開発ができるというのを聞いたのでやってみました。

参考リンク

注意

フォーラムにて規約違反の可能性が指摘されています。自己責任でお願いします。

1:環境構築 / 要件

以下が必要です:

以下の組み合わせのうち、いずれかが必要です:

また、この記事内では以下の記法を用います:

$ -> 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のセットアップ

  1. 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
  1. 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が通っていればどこでも可
  1. 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に加入する必要があります。もし加入している場合はこちらを使うことが推奨されています
加入していない場合はパスワードを選択する必要があります。

  1. Xcode.xipのパスを指定します。
Choice (0-1): 1
...
Path to Xcode.xip: <1.でダウンロードした先のパス>

その後、解凍されるまで放置すればセットアップは完了です。

3:アプリの作成

  1. プロジェクトを作成します。
$ 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
  1. xtool.ymlを編集します。
 version: 1
-bundleID: com.example.hello
+bundleID: com.sevenc7c.hello
  1. 必要に応じてSources/Hello下を編集します。

4:アプリのインストール

usbipd + usbmuxdを使った場合

  1. USBでiPhone/iPad端末をPCに繋ぎます。
  2. 管理者権限でコマンドプロンプトを開きます。
  3. 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を覚えておきます。

  1. 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
  1. xtool devを実行します。
$ xtool dev

が、自分の環境だと動きませんでした...(関連Issue

サイドロード環境の場合

  1. 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
  1. ipaを端末にインストールします。

これは使っているサイドロードツールのドキュメントを参照してください。

うまく行けばアプリがサイドロードできているはずです。

終わりに

まだビルドしただけですが、ビルドできたということに大きな意義があると思います。
Xcodeでのプレビューなどが使えない以上、おそらく現実的なのはCapacitorなどのクロスプラットフォームなGUIライブラリを使うことになると思います。(まだCapacitorをXtoolで動かせていませんが...)

ありがとうございました。

GitHubで編集を提案

Discussion