技術 約6分で読めます

Claude Code × Xcode CLI でiOSアプリのビルドからApp Store公開まで自動化する

Xで「Claude CodeからXcode CLIを叩いて、アプリのビルドからApp Store公開まで全部やらせた」という話を見かけた。本当かよと思って調べたら、実際にできるっぽい。

Androidは別の記事でMCPサーバー経由の自動化を試したけど、iOSも同じ感覚でいけるなら開発効率がかなり上がりそうだ。

この記事では、Xcode CLIツールの全体像と、Claude Codeから呼び出す際のポイントをまとめる。


全体フロー

ステップツールコマンド例
ビルドxcodebuildxcodebuild clean build -scheme MyApp
アーカイブxcodebuildxcodebuild archive -archivePath ./MyApp.xcarchive
IPA出力xcodebuildxcodebuild -exportArchive -exportOptionsPlist options.plist
実機転送xcrun devicectlxcrun devicectl device install app --device <ID> MyApp.ipa
App Storeアップロードxcrun altoolxcrun 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キーが必要。

  1. App Store Connect → ユーザーとアクセス → キー
  2. 「App Store Connect API」タブで新規キーを作成
  3. .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)の場合は methodad-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に任せられる範囲は十分広い。


参考リンク