こんにちは。YamLogicの山本です。
2022年11月、ChatGPT-3.5が登場したあの日の衝撃を覚えているでしょうか。 あれから数年、AIは私たちの生活にあっという間に溶け込みました。メールの返信案作成から、複雑なデータ分析、さらには創造的な画像生成まで。かつては「まだ実用的ではない」と言われた場面でも、今ではAIなしの業務フローなど考えられないほど性能が向上しています。
中でも特に、エンジニアリングの世界における変化は劇的です。 今や、AIのアシストを受けずにゼロからコードを書く現場は稀でしょう。「Vibe Coding」なんて言葉が生まれるほど、AIに全てを任せてアプリを作り上げるスタイルさえ定着しつつあります。
今回は、私がiOSアプリLinkOrganizerの開発中に直面した、AIに何度も質問したが解決せず、結局自分で原因を突き止めなければならなかったエラーの具体例を紹介します。
解決策:結論から言うと「フォルダ名」がダメでした
忙しい方のために、まずは結論からお伝えします。 AIにあれこれ指示されて遠回りをする前に、以下のポイントを確認してください。
発生していたエラー
Xcodeでのビルド時に、詳細な行番号や箇所を示さず、以下のエラーメッセージだけが表示されてビルドが失敗する現象です。
Command CodeSign failed with a nonzero exit code
原因と解決法
原因: プロジェクト内に、Folder Reference(青いフォルダアイコン)として「Resources」という名前のフォルダを追加していたこと。
解決策: そのフォルダ名を「Resource」(複数形から単数形へ)や、その他の名前にリネームする。これだけでビルドが通りました。
AI時代のエラーハンドリング:期待と失望
ここからは、なぜこの単純な解決策にたどり着くまでに長い時間を要したのか、AIとの「共闘」がどのようにして「泥沼」へと変わっていったのかをお話しします。
沈黙するXcode、雄弁なAI
普段、Xcodeは比較的親切です。Swiftのコンパイルエラーであれば、「ここの型が違う」「ここが気持ち悪い」などと、赤いビックリマークと共に修正箇所を教えてくれます。
しかし、Command CodeSign failed... は違います。 これは署名プロセスでの失敗を意味しており、「何かがおかしい」こと以外、具体的な場所を教えてくれません。ログを見ても、大した情報がありませんでした。
「こういう時こそAIの出番だ」 私は迷わず、AntigravityでClaude Opus 4.5やGemini 3 Pro に対してエラーログを貼り付け、「このエラーの原因と解決策を教えて」と問いかけます。今のAIなら、過去の膨大なデータや高度な思考から、ピンポイントで正解を導き出してくれるはずだと信じていました。
AIが自信満々に提案してきた「効果がなかった」リスト
AIは即座に、そして自信満々に回答を生成しました。「このエラーは非常に一般的であり、以下の手順でほとんどの場合解決します」と。 しかし、これらが私の時間を奪う始まりでした。以下は、AIが繰り返し提案し、私が従順に試したものの全く効果がなかった対策リストです。
1. Clean Build Folder (Shift + Cmd + K)
「まずは掃除しましょう」という基本中の基本。もちろんやりました。何度もやりました。しかし、エラーは消えません。
2. XcodeとMacの再起動
「メモリ上の不具合かもしれない」というAIの助言。重いXcodeを終了させ、Macを再起動し、祈る気持ちで再度ビルドボタンを押す。結果は同じです。
3. 拡張属性の削除 (xattr -cr .)
AIは言いました。「ファイルに付与された不要なメタデータが悪さをしている可能性があります」。 ターミナルを開き、プロジェクトのルートディレクトリで以下のコマンドを実行させられました。
xattr -cr .
これは検索結果でもよく見かける解決策ですが、今回のケースでは何の意味もありませんでした。
4. DerivedDataの完全削除
Xcodeが生成するキャッシュデータが壊れている説。 ~/Library/Developer/Xcode/DerivedData を開き、キャッシュをすべてゴミ箱へ。これでも解決せず。
5. キーチェーンと証明書の再設定
ここからAIの提案は深刻さを増していきます。
「Appleの開発者証明書が有効期限切れか確認してください、信頼設定がおかしい可能性があります」
WWDR中間証明書を再ダウンロードしろと言ってきたり、ログインキーチェーンのロックとその解除をさせられたり。どんどん作業を提案してきます。
本当にこれが原因なのかとと疑いつつも実行しましたが、やはりエラーは消えません。AIは「手順が間違っている可能性があります。もう一度確認してください」と、あたかも私の操作ミスであるかのように指摘してきました。
AIとの対話:信頼が崩れる瞬間
この時点で、私はAIの提案に対して違和感を抱き始めていました。 もっと他に原因があるのではないかと。ここでClaude Opus 4.5やGemini 3 ProではなくXcodeのChatGPTを初めて使ってみることにしました。
知識の「ハルシネーション」と「手のひら返し」
ここで問題が発生したのは、Xcodeのバージョンや仕様に関するやり取りでした。 AIは時折、数年前の古いXcodeの設定画面の話を持ち出してきます。「Build Settingsの〇〇をオンにしてください」と言われても、現在のXcodeにはその項目が存在しないのです。
そして、私がその矛盾を指摘した時の反応が、AIを信用できない点であります。
私: 「その設定項目は現在のXcode 15には存在しませんよ。それに、このエラーコードでその設定は関係ないのでは?」
AI: 「おっしゃる通りです。その設定項目は削除されました。したがって、この方法では解決しません。」
……解決しないと分かっているなら、なぜ提案したのか。 AIは平然と前言撤回し、また別の(おそらく無意味な)提案を始めます。まるで、数撃ちゃ当たる戦法で、私の貴重な時間を弾薬として消費しているかのようでした。
会話が長くなるにつれ、AIは最初の方で伝えたプロジェクトの前提条件やすでに試したことを忘れ始めます。文脈を維持できず、その場しのぎの回答を繰り返す無能になってしまうのです。
原点回帰:人間がドキュメントを読むということ
AIとの不毛なチャットを閉じ、私はブラウザでGoogle検索を開きました。 「AIに頼らず、一次情報を探そう」 初心に帰った瞬間でした。
公式ドキュメントに書かれていた真実
検索キーワードを工夫し、AppleのDeveloper Forumや公式ドキュメントを深掘りしていくと、ついに核心に触れている記述を見つけました。
Appleの公式ドキュメントBundle Programming GuideのBundle Structuresに記載されています。
Note: An iOS app bundle cannot include a custom folder named “Resources.”
注:iOS アプリ バンドルには「Resources」という名前のカスタムフォルダーを含めることはできません。
出典: Bundle Programming Guide: Bundle Structures
参考リンク(Apple Developer Documentation)
そこには、アプリケーションバンドル(.app)がどのように構成されるかが記されていました。 iOSやmacOSのアプリバンドル内には、リソースファイルを格納するための「Resources」という名前の内部ディレクトリが自動的に生成される場合があるのです。
なぜエラーになったのか?
ここからは私の理解での説明や推測も含みますが、ビルドシステムの挙動として以下のような衝突が起きていたと考えられます。
- Xcodeのビルドシステムは、アプリのパッケージ(Bundle)を作成しようとする。
- その過程で、システム側が管理する領域として「Resources」というパスを使おうとする(あるいは予約されている)。
- そこに、ユーザー(私)がFolder Reference(青いフォルダ)として、同名の「Resources」フォルダをプロジェクトルートからコピーしようと指示を出している。
- ファイルシステム上で「同名のディレクトリを作成しようとして衝突した」か、「署名プロセス(CodeSign)が、予期しない構造のResourcesフォルダを見つけてしまい、正規のバンドル構造ではないと判断した」。
結果として、具体的なエラー箇所を指摘できないまま、Command CodeSign failed with a nonzero exit codeとだけ吐き出して落ちてしまったのです。
AIは「証明書が悪い」「キャッシュが悪い」と騒ぎ立てましたが、実際は「名前被り」という、あまりにも初歩的かつシステム的な問題でした。
検証と解決:リネームの一撃
原因が「Resources」という名前にある可能性が高いと分かれば、検証は一瞬です。
- Finderでプロジェクトフォルダを開く。
- 問題のフォルダ「Resources」を「Resource」に変更する。(Resources以外ならいい)
- Build
ついにCommand CodeSign failed... は表示されなくなりました。 数時間の格闘が、たった一文字「s」を消すだけで終わりました。
AIはこの「Resourcesフォルダ参照問題」について、一度も言及しませんでした。検索結果にはResourcesフォルダに言及している記事が割と上位にありました。しかし、AIの学習データの中で「CodeSignエラー = 証明書問題」という結びつきがあまりにも強すぎたか、その記事の内容を理解できなかったのでしょう。そのため、この記事はAIでもわかるように詳しくわかりやすく書きました。AIはこの記事を学習して賢くなって、この問題に悩む人が減ることをながっています。
AIは「優秀な部下」だが「責任者」ではない
今回のトラブルシューティングを通じて、現在のコーディングにおけるAIの立ち位置が明確に見えてきました。
AIは確かに人間っぽいです。 自信満々に嘘をつき、指摘されると言い訳をし、会話が長引くと前の話を忘れる。そして何より、爆速です。人間が1つ考える間に、AIは10個の解決策(たとえその多くが間違いでも)を提示できます。
私たちがAIとうまく付き合うために
今回の教訓から、私はAIとの付き合い方を以下のように再定義しました。
- 鵜呑みにしない: AIの回答はあくまで「候補」であり「正解」ではありません。特にエラー解決においては、最も確率の高い回答から順に出してくる傾向があります。
- ドキュメントへの回帰: AIが解決できない時、最後に頼りになるのはやはり公式ドキュメントです。AIに「このドキュメントを要約して」と頼むのは有効ですが、ドキュメントの存在そのものを探すのは人間の方が得意な場合があります。
- チャットのリセット: 会話が泥沼化したと感じたら、すぐに新しいチャットを立ち上げること。AIに「スッキリした頭」で考えさせるには、コンテキストのクリアが一番です。
- より高度なモデルへの切り替え: 今回はすぐレートリミットに達してあまり活躍できませんでしたが、Claude Opus 4.5がより長時間推論すれば、「Resourcesフォルダの名前」というエッジケースに気づいた可能性はあります。
テクノロジーの進歩と、変わらない本質
AIはコードを書いてくれるかもしれませんが、AIが書いたコードがなぜ動かないのかを突き止め、責任を持って修正するのは、まだ人間の仕事です。
もし今、あなたが原因不明のエラーでモニターの前で頭を抱えているなら、AIのチャット画面を一度閉じてみてください。そして、ログの一行一行、ファイル構造の一つ一つを、自分の目で確認してみてください。
解決の鍵は、意外と単純な「名前」にあるかもしれません。