Claude Code × Xcode CLI でiOSアプリのビルドからApp Store公開まで自動化する
Xで「Claude CodeからXcode CLIを叩いて、アプリのビルドからApp Store公開まで全部やらせた」という話を見かけた。本当かよと思って調べたら、実際にできるっぽい。
Androidは別の記事でMCPサーバー経由の自動化を試したけど、iOSも同じ感覚でいけるなら開発効率がかなり上がりそうだ。
この記事では、Xcode CLIツールの全体像と、Claude Codeから呼び出す際のポイントをまとめる。
全体フロー
| ステップ | ツール | コマンド例 |
|---|---|---|
| ビルド | xcodebuild | xcodebuild clean build -scheme MyApp |
| アーカイブ | xcodebuild | xcodebuild archive -archivePath ./MyApp.xcarchive |
| IPA出力 | xcodebuild | xcodebuild -exportArchive -exportOptionsPlist options.plist |
| 実機転送 | xcrun devicectl | xcrun devicectl device install app --device <ID> MyApp.ipa |
| App Storeアップロード | xcrun altool | xcrun altool --upload-app -f MyApp.ipa --apiKey <KEY> |
すべてCLIで完結するため、Claude Codeに「ビルドしてApp Storeにアップロードして」と指示すれば、理論上は自動で実行できる。
前提条件
以下は事前に手動で設定しておく必要がある。CLIだけでは完結しない部分。
必須環境
- macOS + Xcode がインストールされていること
- Apple Developer Program に登録済み(年額12,980円)
証明書・プロビジョニングプロファイル
Xcodeの「Signing & Capabilities」で設定するか、Apple Developer Portalで手動作成。
- Distribution Certificate(配布用証明書)
- App Store用 Provisioning Profile
これらがキーチェーンに登録されていないと、ビルドは通ってもアーカイブで失敗する。
App Store Connect APIキー
アップロードの自動化には、App Store Connect APIキーが必要。
- App Store Connect → ユーザーとアクセス → キー
- 「App Store Connect API」タブで新規キーを作成
.p8ファイル、Key ID、Issuer ID を控えておく
ビルド・アーカイブ(xcodebuild)
プロジェクトのクリーン
xcodebuild clean \
-project MyApp.xcodeproj \
-scheme MyApp \
-configuration Release
アーカイブ作成
xcodebuild archive \
-project MyApp.xcodeproj \
-scheme MyApp \
-configuration Release \
-archivePath ./build/MyApp.xcarchive \
-destination 'generic/platform=iOS'
ワークスペース(.xcworkspace)を使う場合は -project を -workspace に変更。
IPA出力
xcodebuild -exportArchive \
-archivePath ./build/MyApp.xcarchive \
-exportOptionsPlist exportOptions.plist \
-exportPath ./build
exportOptions.plist の設定例
App Store用の設定:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<true/>
<key>signingStyle</key>
<string>automatic</string>
</dict>
</plist>
開発用(Ad Hoc)の場合は method を ad-hoc に変更。
実機への転送
iOS 17以降: xcrun devicectl
Xcode 15以降、Apple純正の devicectl コマンドが使える。
# デバイス一覧
xcrun devicectl list devices
# アプリをインストール
xcrun devicectl device install app \
--device <DEVICE-ID> \
MyApp.ipa
# アプリを起動
xcrun devicectl device process launch \
--device <DEVICE-ID> \
com.example.MyApp
iOS 16以前: ios-deploy
サードパーティツールの ios-deploy を使う。
# インストール
brew install ios-deploy
# デバイス一覧
ios-deploy -c
# アプリをインストール&起動
ios-deploy -b MyApp.app -d
注意: ios-deployはiOS 17以降では動作しない。iOS 17+では devicectl を使うこと。
App Storeへのアップロード(altool)
認証情報をキーチェーンに保存
毎回パスワードを入力するのは面倒なので、キーチェーンに保存しておく。
App Store Connect APIキーを使う場合(推奨):
xcrun notarytool store-credentials "my-api-key" \
--key /path/to/AuthKey_XXXXXXXXXX.p8 \
--key-id <KEY_ID> \
--issuer <ISSUER_ID>
App固有パスワードを使う場合:
xcrun altool --store-password-in-keychain-item "my-app-password" \
-u your@email.com \
-p <APP_SPECIFIC_PASSWORD>
アップロード
xcrun altool --upload-app \
-f ./build/MyApp.ipa \
--apiKey <KEY_ID> \
--apiIssuer <ISSUER_ID>
または:
xcrun altool --upload-app \
-f ./build/MyApp.ipa \
-u your@email.com \
-p @keychain:my-app-password
検証のみ(アップロードせずチェック)
xcrun altool --validate-app \
-f ./build/MyApp.ipa \
--apiKey <KEY_ID> \
--apiIssuer <ISSUER_ID>
アップロード前に検証だけ走らせると、エラーを早期に発見できる。
Claude Codeから使う際のポイント
1. 環境変数を設定しておく
APIキーのパスや各種IDを環境変数に入れておくと、Claude Codeへの指示が簡潔になる。
# ~/.zshrc
export APPLE_API_KEY_PATH="$HOME/.apple/AuthKey_XXXXXXXX.p8"
export APPLE_API_KEY_ID="XXXXXXXXXX"
export APPLE_API_ISSUER_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
2. exportOptions.plist をリポジトリに含めておく
プロジェクトルートに exportOptions.plist を置いておけば、Claude Codeが迷わずビルドできる。
3. 一連の流れをスクリプト化
複数コマンドを毎回指示するのは面倒なので、シェルスクリプトにまとめておくのも手。
#!/bin/bash
# scripts/build-and-upload.sh
set -e
xcodebuild clean archive \
-project MyApp.xcodeproj \
-scheme MyApp \
-configuration Release \
-archivePath ./build/MyApp.xcarchive \
-destination 'generic/platform=iOS'
xcodebuild -exportArchive \
-archivePath ./build/MyApp.xcarchive \
-exportOptionsPlist exportOptions.plist \
-exportPath ./build
xcrun altool --upload-app \
-f ./build/MyApp.ipa \
--apiKey $APPLE_API_KEY_ID \
--apiIssuer $APPLE_API_ISSUER_ID
echo "Upload complete!"
Claude Codeには「scripts/build-and-upload.sh を実行して」と言うだけで済む。
CI/CD連携への発展
GitHub ActionsやJenkinsでも同じCLIコマンドが使える。
GitHub Actionsでの注意点
- macOSランナー(
runs-on: macos-latest)が必要 - 証明書とプロビジョニングプロファイルはSecretsに保存
.p8ファイルもSecretsにBase64エンコードして保存
- name: Build and Upload
env:
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER_ID: ${{ secrets.APPLE_API_ISSUER_ID }}
run: |
echo "$APPLE_API_KEY" | base64 --decode > AuthKey.p8
./scripts/build-and-upload.sh
できること・できないことの整理
| 項目 | CLI対応 | 備考 |
|---|---|---|
| ビルド・アーカイブ | ✅ | xcodebuild |
| 実機転送 | ✅ | devicectl / ios-deploy |
| App Storeアップロード | ✅ | altool |
| TestFlight配布 | ✅ | アップロード後、App Store Connectで自動配布設定可 |
| 審査提出 | ⚠️ | App Store Connect APIで可能だが設定が複雑 |
| 初回の証明書作成 | ❌ | XcodeかApple Developer Portalで手動 |
| App ID作成 | ❌ | 同上 |
| 新規アプリ登録 | ❌ | App Store Connectで手動 |
結論: 初期設定さえ済んでいれば、日常的なビルド→アップロードの流れはCLIで完結する。Claude Codeに任せられる範囲は十分広い。