
2026/07/14 3:22
Xcode を起動することなく Mac および iOS アプリを開発して配送する方法
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本テキストでは、Xcode を一度設定した後の開封を不要とする堅牢で完全にヘッドレスの iOS アプリケーションの作成・デプロイワークフローが概説されています。シェルスクリプトによるライフサイクル全体のアオマティゼーションを通じて、開発者は
xcodebuild コマンドラインツールを用いてコードをコンパイルし、notarytool によってビルドを保護し、devicectl を用いて物理デバイスにアプリを直接インストールします。セキュリティは、証明書ベースのキーチェーンおよび外部パスワードマネージャーの活用により維持され、プライベートキーなどの機密情報はバージョン管理システムへの投入を完全に防ぎます。本システムは XcodeGen を用いてプロジェクトを管理し、煩雑なローカルフォルダではなくクリーンな YAML 設定ファイル(.yml ファイル)によってプロジェクトを制御し、アドホックテスト版と公式開発者 ID リリースを自動的に区別します。一度設定されたリリーススクリプトは、アーカイブ、署名、認証化、スタプリング、インストールを含む厳格なパイプラインを実行し、沈黙する失敗を防ぐために堅牢なエラー処理(set -euo pipefail)を採用します。このアプローチは、チームが手動のマウス操作または GUI ウィンドウなしに、実際に動作するソフトウェアを効率的にデプロイするために安全で再現可能な CI パイプラインを構築することを可能にします。
Text to translate:
The text outlines a robust, fully headless workflow for creating and deploying iOS applications that eliminates the need to open Xcode after an initial setup. By automating the entire lifecycle through shell scripts, developers utilize command-line tools such as
xcodebuild to compile code, notarytool to secure builds, and devicectl to install apps directly onto physical devices. Security is maintained by leveraging certificate-based keychains and external password managers, ensuring sensitive secrets like private keys never enter version control. The system employs XcodeGen to manage projects via clean YAML configurations (.yml files) rather than cluttered local folders, automatically distinguishing between ad-hoc testing versions and official Developer ID releases. Once configured, a release script executes a rigorous pipeline involving archiving, signing, notarizing, stapling, and installation, while using strict error handling (set -euo pipefail) to prevent silent failures. This approach empowers teams to establish secure, repeatable CI pipelines that deploy real software efficiently without any manual mouse interactions or GUI windows.本文
Xcode GUI 不要!CLI だけで自動化する Apple アプリ開発ガイド
最近、「Xcode は使いにくい」という声がポッドキャストなどで上がっています。しかし、少しの事前準備を行えば、Xcode.app を起動せずに完全に自動化された macOS/iOS アプリ開発環境を構築できます。この記事は、一度だけ行うセットアップ手順と、その後「ヘッドレス(GUI なし)」でビルド・デプロイする方法を解説します。
基本コンセプト
- Xcode.app のインストールは必須ですが、起動する必要はありません。内部ツール(
,xcodebuild
など)は CLI から直接呼び出せます。notarytool - 初期設定: Apple ID シグアップ、証明書作成、ノタライゼーション資格情報の保存は、一度限りです。
- 自動化スクリプト: 単一のスクリプト (
) で、アーカイブ→署名→ノタライズ→スタップリング→インストールの全工程を制御します。release.sh - 機密情報の安全: シーレット情報はキーチェーンに格納され、リポジトリ(Git)にコミットされません。
1. Xcode のインストールと設定
インストールの確認
Xcode をインストールした直後は、コマンドラインツールのパスが
/Library/Developer/CommandLineTools に設定されている可能性があります。これを Xcode.app 内部のツールチェーンに変更する必要があります。
確認・変更コマンド:
# 現在のパスを確認 xcode-select -p # パスが /Applications/Xcode.app... でない場合は修正 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
NOTE
という名称は誤解を招きます。CommandLineTools
: 軽量パッケージ(clang, git 含む)。iOS SDK や/Library/Developer/CommandLineToolsは含まれません。notarytool : フルなツールチェーン。開発に必須。/Applications/Xcode.app/Contents/Developer
XcodeGen のインストール
Xcode プロジェクトの自動生成・管理には
XcodeGen を使用します。これにより、.xcodeproj フォルダ全体を Git に追跡せず、設定だけ(YAML ファイル)を管理できます。
brew install xcodegen
2. 一度限りの初期設定
このステップは初回のみ行います。これ以降はマウスを使わずに済みます。
2-1 ライセンスとコンポーネントの受け入れ
Xcode のライセンスをCLI から受け入れます。
sudo xcodebuild -license accept sudo xcodebuild -runFirstLaunch
2-2 Apple Developer アカウントの登録
Xcode を一度起動して(または GUI ツール)、アカウントを追加します。
NOTE アプリを配布・ノタライズするには、有料の Apple Developer Programへの加入が必要です。 また、Gatekeeper(セキュリティフィルター)を通過させるにはアプリに「公证(ノタライゼーション)」処理を行っておくことが強く推奨されます。
2-3 開発者 ID 証明書の作成
出荷用
.app を署名するための証明書を作成します。
重要: Developer ID Application と Apple Development は異なります。
| 証明書タイプ | 用途 |
|---|---|
| Developer ID Application | 出荷用。Gatekeeper を通過し、他人の Mac でも動作するアプリ向け。 |
| Apple Development | 開発環境用。自身の iPhone でのテストやローカルデバッグ向け。 |
証明書を作成すると、個人用キー(Private Key)がログインキーチェーンに格納されます。これらを削除しないでください。
2-4 ノタライゼーション資格情報の保存
notarytool が認証するためのプロフィールをターミナルから作成します。
# プロフィール名とチーム ID を設定してください xcrun notarytool store-credentials App-Name \ --apple-id "[email protected]" \ --team-id YOUR-TEAM-ID # ※プロンプトに応じてアプリ固有のパスワードを入力
重要な注意点
- プロフィール名の統一: 他アプリのプロフィールを使わず、独自の名称(例:
)を使用してください。App-Name - パスワードの種類: Apple ID のパスワードではありません。「アプリ固有のパスワード」が必要です。
- appleid.apple.com → Sign-In & Security → App-Specific Passwords から作成してください。
- 期限切れへの対処: Apple ID パスワード変更時に旧パスワードは無効になります。エラー
はパスワード更新後の対応を意味します。401 invalid credentials
ヒント: 1Password などに保管し、Claude Code など AI ツールと連携させることで、パスワード管理も自動化できます。
3. プロジェクト設定の用意
ローカル設定ファイル (Local.xcconfig
)
Local.xcconfigチーム ID とバンドルプレフィックスなどの機密情報を
.xcconfig ファイルに格納し、プロジェクトから分離します。
cp Local.xcconfig.example Local.xcconfig # 以下の項目を編集してください: # BUNDLE_PREFIX = your.real.prefix # DEVELOPMENT_TEAM = YOUR-TEAM-ID
.gitignore
の追加
.gitignoreリポジトリに機密情報やビルド生成物を含まないようにします。
# .xcodeproj フォルダ全体を無視 .xcodeproj/ # ローカル設定ファイル(チーム ID 等)をバージョン管理外 Local.xcconfig build/ *.xcarchive
4. デプロイ自動化スクリプト (release.sh
) の作成
release.shXcode.app を起動せず、完全自動化を実現するメインのスクリプトです。以下は生成されたスクリプトの構造例です(AI に作成させる場合が推奨されます)。
スクリプトの流れ
- プレフライト:
とノタライプロファイルの存在確認。xcodegen - プロジェクト再生成: YAML 設定から
を生成。.xcodeproj - アーカイブ作成: Release ブィルドを
に出力。.xcarchive - 開発者 ID エクスポート: アーカイブを署名した
に変換。.app - ノタライゼーション: Apple サーバーでウイルススキャンと署名認証。
- スタップリング: 署名チケットを添着し、Gatekeeper 通過の準備。
- 検証とインストール:
へのコピーと登録。/Applications
#!/usr/bin/env bash # scripts/release.sh — Developer ID-signed, notarized MY-APP-NAME.app install set -euo pipefail # 設定変数 PROJECT="MY-APP-NAME.xcodeproj" SCHEME="MY-APP-NAME-macOS" APP_NAME="MY-APP-NAME" TEAM_ID="YOUR-TEAM-ID" NOTARY_PROFILE="${MY-APP-NAME_NOTARY_PROFILE:-MY-APP-NAME}" BUILD_DIR="build" # 実装詳細(アーカイブ→署名→ノタライズ→スタップリング→インストールのロジック) # ... (略)
スクリプトの実行
一度
release.sh を作成・修正すれば、以降は以下のようないくつかのコマンドだけで完了します。
- 失敗時の挙動:
によりエラー時点で停止し、どこで失敗したかを報告します。set -e - ローカルの高速テスト用コマンド:
- 署名なしでビルド&テスト:
swift test xcodebuild -project YOUR-PROJECT.xcodeproj -scheme YOUR-SCHEME \ -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO build
- 署名なしでビルド&テスト:
5. AI エージェント向けマニュアル (CLAUDE.md
)
CLAUDE.md自動化を確実に行うために、AI ツール(Claude Code など)に動作方針を記述します。
## Build commands \`\`\`bash # プロジェクト再生成 xcodegen generate # テスト (署名なしで高速) swift test # ローカルビルド (署名なし: CI またはサニタチェック用) xcodebuild -project YOUR-APP.xcodeproj -scheme YOUR-SCHEME \ -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO build # 本番リリース用コマンド ./scripts/release.sh # archive → Developer ID → notarize → staple → install \`\`\` ## Notes for Agent - Ad-hoc builds (`CODE_SIGNING_ALLOWED=NO`) are fast but cannot be distributed. Use `./scripts/release.sh` for real distribution. - Signatures and notarization credentials are stored in the login Keychain, NOT in git.
6. なぜ Xcode を開かなくて済むのか?(技術解説)
| タスク | GUI ワークフロー (マウス操作) | HEADLESS ワークフロー (スクリプトのみ) |
|---|---|---|
| プロジェクト生成 | Xcode が を管理 | |
| ビルド | ⌘B / ランボタン | |
| アーカイブ | Product → Archive | |
| 署名エクスポート | Organizer → Distribute | |
| ノタライズ | Organizer アップロード | |
| スタップリング | (Organizer 内で自動) | |
| インストール | ドラッグ&ドロップ | |
- 署名の仕組み: 開発者 ID 証明書と個人用キーがログインキーチェーンに格納されており、
が自動的に検出してバイナリを署名します。xcodebuild - 機密情報の安全性: パスワードや証明書を Git にコミットしません。すべて CLI ツールの標準機能で処理されます。
- ノタライゼーションの位置づけ: 署名(作者の確認)とは別に、Apple がマルウェアを判定した際の「チケット(スタップル)」を添着するセキュリティプロセスです。
まとめ
このガイドに従ってセットアップを行えば、「Xcode を開く」という行為は不要になります。
- 初期設定: 一度の GUI 操作とパスワード入力。
- 日常的な作業:
やswift test
の実行のみ。release.sh
残りの時間は、マウスを操作する代わりに、コードレビューや新規機能の開発に注力できます。最初の数時間を投資してスクリプト化すれば、その後の開発速度は劇的に向上します。