ガイド

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が指しているものです。指示ファイルでバージョンを固定してください。複数のバージョンがあるマシンでは、ビルドの前に確認するようエージェントに指示してください。

関連ガイド