【Xcode】embedded binary's bundle identifier is not prefixed... エラーの修正手順
Xcodeでアプリの開発を進めていると、ビルド時に突然見慣れない長文のエラーに遭遇することがあります。
今回は、私がiOSアプリにWidget機能を組み込もうとした際に発生した 「embedded binary's bundle identifier is not prefixed with the parent app's bundle identifier」 というエラーの解決方法について、原因と具体的な修正手順をシェアします。
エラーが意味していること
このエラーメッセージを直訳すると、「埋め込みバイナリのバンドル識別子の前に親アプリのバンドル識別子がついていません」となります。
要するに、アプリ本体(親アプリ)の識別子と、そこに組み込もうとしているWidgetなどの拡張機能(Embedded Binary)の識別子の間で、 名前の規則性に矛盾が生じている のが原因です。
私自身のケースでは、開発用ビルドとして親アプリの識別子の末尾に「-dev」を付けていたため、新しく追加したWidget側の識別子と構造が一致しなくなり、このエラーが吐き出されてしまいました。
具体的なエラーの原因(不一致の例)
エラーが発生しているとき、それぞれのターゲットのBundle Identifierは以下のような状態になっています。
Embedded Binary(Widget側)のバンドル識別子:
com.yourname.AppName.Widgut
親アプリ(本体側)のバンドル識別子:
com.yourname.AppName-dev
ご覧の通り、親アプリの末尾が -dev になっているのに対し、Widget側は .AppName.Widgut となっており、親アプリの識別子を正しく引き継げていません。Xcodeは「親アプリの名前から始まる正しいルールで名前を付け直してください」と怒っているわけです。
エラーを解消する修正手順
この問題は、双方のターゲットのBundle Identifierの整合性を整えてあげることで綺麗に解決します。
- 親アプリの正確なバンドル識別子を確認する
- 例:
com.yourname.AppName-dev
- 例:
- エラーが出ているターゲット(Widget等)のバンドル識別子を確認する
- 例:
com.yourname.AppName.Widgut
- 例:
- ターゲット側の識別子を、親アプリの文字列から始まる形に修正する
- 修正例:
com.yourname.AppName-dev.Widgut(親アプリの識別子の後ろにドットを繋げて拡張機能の名前を入れる)
- 修正例:
- プロジェクトをクリーン(Cmd + Shift + K)して再ビルドする
修正後の状態
正しく修正が行われると、識別子の関係性は以下のようになります。
Embedded Binary(Widget側)のバンドル識別子(修正後):
com.yourname.AppName-dev.Widgut
親アプリ(本体側)のバンドル識別子:
com.yourname.AppName-dev
このように親アプリの識別子が綺麗に先行する形でプレフィックスとして含まれていれば、Xcodeはエラーを出しません。
トラブルを振り返って
XcodeとSwiftUIの組み合わせで新機能を追加していく際、ビルド構成やスキームによってアプリ本体のBundle Identifierを動的に変えていると、今回のような識別子の不一致トラップによく引っかかります。
もし同様のエラーでビルドが止まってしまった場合は、焦らずに 「本体側とターゲット側の識別子のプレフィックスが完全に一致しているか」 をチェックしてみてください。ルールに沿って名前を整えるだけで、あっさりとビルドが通るようになります。