iOSのコーディングエージェントに本物のMacが必要な理由
エージェントは、Swiftならどこでも書けます。しかし、iOSアプリをビルドし、実行し、画面を確認できるのはMacの上だけです。iOSの作業でループにMacが必要なのは、まさにこの差のためです。Macを持つエージェントがずっと優秀になる理由も同じです。自分の作業を自分で確認できるからです。このページでは、macOSでしかできないことを挙げ、当社のマシンでエージェント向けに設定しているループを紹介します。
macOSでしかできないこと
- アプリのビルド。xcodebuildとXcodeはmacOSにしかありません。Linuxマシンでも、SwiftのパッケージやサーバーサイドのSwiftはコンパイルできます。しかしiOSアプリは作れません。
- 実行。iOSシミュレータはXcodeの一部です。シミュレータがなければ、エージェントが変更したばかりのアプリを動かす手段がありません。
- 画面の確認。エージェントがレイアウトの崩れに気づくのは、実行中のアプリのスクリーンショットによってです。それにはシミュレータが必要です。
- UIテスト。XCUITestは、シミュレータか実機でアプリを操作します。macOS専用です。
- 署名とアップロード。コード署名、プロビジョニングプロファイル、App Store Connectへのアップロードは、すべてmacOS上のAppleのツールを通ります。
つまり、Linux上のエージェントはSwiftのファイルを編集して推測するだけです。Mac上のエージェントは、編集し、ビルドし、実行し、画面を見て、直せます。役に立つのは後者です。
ループの手順
これを一度設定し、コマンドをエージェントの指示ファイルに書いておきます。そうすれば、毎回言わなくてもエージェントが使います。まず、シミュレータを探して起動します。
xcrun simctl list devices available xcrun simctl boot "iPhone 16"
そのシミュレータ向けにビルドします。スキームはご自身のものに置き換えてください。
xcodebuild -scheme MyApp \ -destination 'platform=iOS Simulator,name=iPhone 16' \ -derivedDataPath build \ build
ビルドをインストールして起動します。
xcrun simctl install booted build/Build/Products/Debug-iphonesimulator/MyApp.app xcrun simctl launch booted com.example.MyApp
エージェントが読めるスクリーンショットを撮ります。
xcrun simctl io booted screenshot /tmp/screen.png
Claude CodeとCodexは、どちらも画像ファイルを開けます。UIを変更するたびにスクリーンショットを撮り、完了と判断する前に、見えているものを説明するようエージェントに指示します。この1つの指示で、レイアウトの間違いのほとんどを見つけられます。
テストも同じ方法で実行する
xcodebuild -scheme MyApp \ -destination 'platform=iOS Simulator,name=iPhone 16' \ -derivedDataPath build \ test
DerivedDataのパスが重要です。プロジェクトのフォルダ内に置けば、2回目のビルドは差分ビルドになり、数分ではなく数秒で終わります。ビルドのたびに4分待つエージェントは、4分の1の作業しかこなせません。
ループを指示ファイルに書く
どちらのエージェントも、リポジトリのルートにあるファイルからプロジェクトの指示を読みます。Claude CodeはCLAUDE.md、CodexはAGENTS.mdを読みます。そこにループを書いておけば、どのセッションもそれを踏まえて始まります。
## Building and checking this app - Build: xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16' -derivedDataPath build build - Run: xcrun simctl install booted build/Build/Products/Debug-iphonesimulator/MyApp.app && xcrun simctl launch booted com.example.MyApp - Look: xcrun simctl io booted screenshot /tmp/screen.png, then open the image - After any UI change, build, run, and look before saying it is done. - Tests: same xcodebuild command with test instead of build.
エージェントがつまずくポイント
- Xcodeが選択されていない。新しいXcodeをインストールしたら、xcode-selectでそれを指定します。そうしないと、xcodebuildは古いほうを使います。
- シミュレータが起動していない。起動コマンドが、分かりにくいエラーで失敗します。先にシミュレータを起動し、起動したままにしておきます。
- ランタイムがインストールされていない。入れたばかりのXcodeには、ダウンロードするまでiOSのランタイムがありません。ダウンロードは数GBあり、エージェントが作業を始める前に済ませておく必要があります。
- ログインセッションがない。シミュレータはGUIのアプリケーションです。誰もログインしていないヘッドレスのマシンでは起動しません。エージェントのユーザーには有効なデスクトップセッションが必要です。無人のMacで自動ログインが重要なのはこのためです。
当社が用意しておくもの
当社のエージェント用Macには、Xcodeがインストール済みで、iOSのランタイムもダウンロード済みです。エージェントのユーザーには、常時有効なデスクトップセッションがあります。Claude CodeとCodexは、あなたのサインインを待っています。上のループを指示ファイルに加えれば、最初のタスクから、エージェントがアプリをビルドして画面を確認できます。マシン上でほかに何ができて何ができないかは、機能のガイドで説明しています。
よくある質問
Claude CodeはLinuxでiOSアプリをビルドできますか?
+
いいえ。LinuxでもSwiftのファイルは編集でき、Appleのフレームワークに依存しないSwiftパッケージならコンパイルもできます。iOSアプリのビルドにはXcodeが必要で、XcodeはmacOSでしか動きません。
エージェントに実機のiPhoneは必要ですか?
+
ほとんどの作業では不要です。ビルド、実行、スクリーンショット、UIテストはシミュレータでまかなえます。実機が必要なのは、カメラ、プッシュ通知、実際のハードウェアでの性能などです。
エージェントはシミュレータのスクリーンショットを撮れますか?
+
はい。simctlのscreenshotコマンドで撮れます。条件は、シミュレータが起動していて、エージェントのユーザーにデスクトップセッションがあることです。エージェントはその画像を開いて読み取れます。
エージェントはどのバージョンのXcodeを使いますか?
+
xcode-selectが指しているものです。指示ファイルでバージョンを固定してください。複数のバージョンがあるマシンでは、ビルドの前に確認するようエージェントに指示してください。