Xcodeを一切開かずにMac/iOSアプリをビルド&リリースする魔法のような方法
Building and shipping Mac and iOS apps without ever opening Xcode
Building and shipping Mac and iOS apps without ever opening Xcode
Xcodeの重い動作や複雑な設定にうんざりしていませんか?実は、XcodeのGUIに依存することなく、コマンドラインツールを活用してMacやiOSアプリをビルドし、リリースまで完結させるスマートな手法が存在します。開発環境を軽量化し、CI/CDとの親和性を高めたいすべてのエンジニアに捧げる、脱Xcodeビルドの極意をご紹介します。
これを読むとちょっと笑っちゃうよね:
Claude Codeで作成したんだ。Claudeにこんな風に言ったよ。「Xcodeを一切開かずに、このアプリをアーカイブして、Developer IDで署名して、公証して、ステープルして、/Applicationsにインストールしたい。全行程を実行して、どこかで失敗したらしっかりエラーを出すスクリプトを書いて」ってね。
結局のところ、私たちが読んでいるこのテキスト自体、Claudeが私たちに話しかけているものなんだけどさ笑。
それにしても、ブログ記事の至る所で「LLMに聞け」って言及されてるのが面白いね。
このブログ記事をClaude Codeや好みのLLMコーディングツールに読み込ませて、あとはやらせればいい
迷ったら、好みのLLMに聞いて設定を助けてもらおう。どのみち、代わりにXcodeを使うのはそいつなんだから。
LLMを使うそもそもの目的は、やりたくない手作業を避けることなんだ。
ここでも迷ったら、Claude Codeや好みのLLMに作らせればいい。
繰り返しになるけど、だからこそLLMと対話して、やりたいことを伝え、ワークフローの構築を手伝ってもらうんだよ。
自作の補完的なオープンソースプロジェクトを紹介してもいいかな?Axiom¹は、コーディングエージェントがApple OS開発でこういう処理を効率的にこなせるようにするためのツールだよ。
豊富なスキルやエージェントのライブラリに加えて、AxiomにはLLM用のツール²もいくつか含まれてる。xclog、xcprof、xcsym、xcuiといったツールは、LLMが使うことを前提に設計されていて、トークン効率の良い方法で機能を利用できるんだ。もちろん、Axiom以外のスキルやエージェントでも同じように便利だよ。
¹ Axiom: https://charleswiltgen.github.io/Axiom/
² Axiom CLIツール: https://charleswiltgen.github.io/Axiom/tools/
自分は趣味でiOSアプリのビルドとテストをLinuxだけでやってるよ。
驚くほど簡単だよ。これ、最高にうまくいく:https://github.com/xtool-org/xtool
TestFlightやApp Storeにアップロードする必要すらない。iPhoneをUSBで繋いで、Linuxから直接インストールできちゃうからね!
迷ったら、コーディングエージェントに「Hello World」のiOSアプリを作ってアップロードするのを手伝って、って聞いてみて。本当に簡単だから。
Sweetpad CLIもチェックしてみて。基本的にはxcodebuildのラッパーなんだけど、人間にもエージェントにも使いやすいようになってる。VSCodeでiOS/Swift開発をするためのSweetpad VSCode拡張機能の次のプロジェクトとして作ってるんだ。CLIはまだベータ版だけど、自分のプロジェクトで使ってみてもかなり快適だよ。
個人的な経験から言うと、アプリを「雰囲気で」コーディングするなら、長期的に見てExpoを使うのが正解だと思う。
ベースがReactだから、LLMの学習データに含まれるコード量がSwiftよりも圧倒的に多くて、生成されるコードの品質もずっと高いんだ。
全部コマンドラインで完結するし、Webビューだからデバッグもめちゃくちゃ楽。なのに一度ネイティブiOSアプリとしてコンパイルしてしまえば、他のネイティブアプリと遜色ない使い心地だよ。
ExpoとFastlaneを組み合わせれば、iOSの提出とデプロイも完全自動化できる。コマンドを一つ叩けば、App Storeに新しいバージョンが並ぶってわけ。
技術的には、結局Xcodeを使っていることになるよね。
Xcodeは、多くのシステムレベルのUNIXユーティリティやアプリ(これらは一般的にそれほどバグだらけじゃない)を包み込んでいる、[ひどくバグだらけの]GUIラッパーでしかないからね。
CLIを使ってアプリをリリースするなんて、かなり古くからの慣習だよ。少なくとも自分がやり始めた頃(2012年に最初のXcodeアプリをリリースした時)からずっとそうだし。
この手法の欠点は、エージェントをサンドボックス内じゃなくてMac上で直接実行しなきゃいけないことかな。自分もそうしてるけど、サンドボックスじゃ解決できない問題が山ほどあるからね。みんなが長年培ってきたセキュリティ対策を窓から投げ捨てるようなものだって怒るのもわかるよ。
xAIが誰かのホームディレクトリ(SSH鍵を含む)をアップロードしちゃった事件があったでしょ。あれで今の自分のやり方を見直そうかと本気で悩んでる。
普段はPCが「壊される」ことは心配してないんだ。復元不可能なデータはそんなにないし、全部バックアップしてGitにコミットしてるから、数時間あればほとんど元に戻せるしね。
とはいえ、.SSHディレクトリをAIエージェントに送信されるのは絶対にごめんだ。プロンプトで回避しようとするのはバカげてる。システムレベルでブロックしなきゃいけない。別のユーザーを作って、ホームディレクトリに700の権限をかけようか検討中だよ。
なんだか1990年代のセキュリティに逆戻りした気分だね。諸刃の剣だけど、前例のないスピードで仕事が進むっていう恩恵はあるし。
非難してるわけじゃないよ。自分も共犯者みたいなもんだからさ。
この方面を探索してる人たちに、ちょっとしたコツを一つ。自分は最後にXcodeプロジェクトを開いてから5年経つから、時代遅れかもしれないけどね。
長年Xcodeと格闘してきたプロとして、swift buildが登場したときは歓喜したよ。でもXcodeがそれをうまく取り入れられてなくて失望した。結局、アプリ全体をSwiftパッケージとして設定して、Xcodeプロジェクトにはapp_main()(または好きな名前の関数)を呼ぶだけのメインソースファイルを1つ置いておく形に落ち着いたんだ。
正確には覚えてないけど、新規プロジェクトの設定でちょっと面倒なことがあったはず。確かXcodeはデフォルトで、SwiftパッケージをGitからチェックアウトした依存関係として扱おうとするんだけど、同じプロジェクトディレクトリ内にローカル依存関係をドラッグ&ドロップすれば動いたはずだよ。
こうすると、ファイルがXcodeによって管理されなくなるから、名前変更やマージでproject.pbxprojが書き換わって事故ることもなくなる。Swiftパッケージのディレクトリを指定するだけで完了だ。
大きな個人プロジェクトで使ってたけど、すごく快適だったよ。
一時期は、Xcodeを完全に排除するためにXcodeの手順をすべて模倣した自作ビルドツールも作ったんだ。それもうまくいったし(大して難しくもなかった)、ただ当時はVS CodeのデバッガーよりXcodeのデバッガーUIが優れていたのと、特にMetalデバッガーを使いたかったから結局Xcodeに戻っちゃったんだけどね。
デバッグの少なくとも一部には、結局みんなXcodeを使うことになるはず。それは避けられないね。
ビルドに関しては、エージェントはコマンドラインでやる方法をすでにかなり知ってるはずだけど、状況に応じて具体的な指示を出せばもっと速くビルドできるよ。
XcodeGenについては、もしすでにXcodeのファイルシステム同期グループを使ってるなら、余計なオーバーヘッドかもしれない。
iOS開発なら一番のオススメは、エージェントにApp Store Connectスキルを有効にしてあげることかな(https://github.com/rorkai/App-Store-Connect-CLI )。
これを使えばXcodeを常に開いておく必要がないどころか、MacBookの近くにいる必要すらないんだ。
iPhoneからCodex経由で変更を加えて、ascにTestFlightへのビルドとアップロードを指示して、ダウンロードして新しいバージョンを実行する……これだけでいい。
手前味噌だけど、strudel [0] を作ってるよ。この記事と同じようなアイデアをたくさん取り入れたCLIで、Xcodeに触れずにMac(とiOS)アプリをビルド・署名・公証できるんだ。ドライランモードがあるから、実際にどんなコマンドが実行されるか確認できるよ。何が起きてるか謎な状態にはしたくなかったから、これは自分にとって重要だった。
もっとブログで紹介すべきなんだけど、Apple IDだけで無料でiOSプロビジョニングができるようにしたり(内部APIを使用)、macOSアプリ配布用に綺麗なDMGを作れるようにしたり(.DS_storeファイルをリバースエンジニアリングしたよ)と、いろいろ工夫したんだ。コーディングエージェントにスキルをインストールするコマンドも内蔵してて、作るのが楽しかったよ。
[1] はこれで作ったサンプルのアプリで、macOSのファイル拡張子関連付けを管理するシンプルなユーティリティだよ。
[0] https://github.com/octavore/strudel
[1] https://github.com/octavore/tots.app