【Xcode】xcode This bundle is invalid. The Info.plist key CFBundleExecutable のエラーについて

どうも、ねこきち（<a href="https://mobile.twitter.com/nekokichi1_yos2">@nekokichi1_yos2</a>）です。

今回は、下記のエラーについて解説します。
>This bundle is invalid. The Info.plist key CFBundleExecutable contains value プロジェクト名 in Payload/プロジェクト名.app. It should not contain any of these disallowed characters: \ [ ] { } ( ) + *

## どんなエラーか

Google翻訳だと、
>このバンドルは無効です。 Info.plistキーCFBundleExecutableには、ペイロードプロジェクト名.appに値プロジェクト名が含まれています。 次の許可されていない文字を含めることはできません：\ [] {}（）+ *

つまり、**CFBundleExecutable、あるいはプロジェクト名に使用禁止の文字（：\ [] {}（）+ *）が含まれてるのが問題**、だそうです。

### CFBundleExecutableとは？

Xcodeでの実行可能ファイル、言い換えると、アプリまたはプロジェクトで表示される名前。

## どういう状況で遭遇したか

下記のアプリを初めてリリースする際、Xcode経由でAppStoreConnectにipaファイルをアップロードした時に遭遇しました。
[→StudyApp](https://apps.apple.com/jp/app/studyapp-%E5%AD%A6%E7%BF%92%E3%81%AE%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA/id1524655038)

原因は、プロジェクト名に()が入っていたからです。
(プロジェクト名は、(Beta)StudyApp、でした..。)

## どう解決したか？

### プロジェクト名を変更

最初は、プロジェクト名を変更しようとしました。
（参考：[Xcode10でプロジェクト名を変更する](https://swiswiswift.com/2018-11-12/)）

ですが、どこかでミスったのか、Xcodeでファイル構成がおかしなことに。
（本来の構成：左、　おかしな構成：右）
<img width="220" alt="スクリーンショット 2020-08-11 14.05.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/865f861d-9310-423b-2c90-9a8f57314b08.png"><img width="280" alt="スクリーンショット 2020-07-23 11.45.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/5672ab25-4c83-ce1b-5dab-7b0be5673b64.png">

プロジェクト名の変更は、
・ファイル名
・ファイルの参照先
・info.plistの値
などの変更も必要なので、**1つでも手順を間違えると、最悪元の状態に戻せなくなります。**
（GitHubに最新版を上げてたのでプロジェクトは無事に復元できましたが。）

そこで、違う方法を取りました。

### アプリとしての名前を変更

そもそも、今回のエラーはCFBundleExecutableの値が原因です。

じゃあ、CFBundleExecutable、をどう変更するか。

**実は、CFBundleExecutableと
・EXECUTABLE_NAME
・PRODUCT_NAME
・TARGET_NAME
は同値だったのです。**

(CFBundleExecutable = EXECUTABLE_NAME)
<img width="829" alt="スクリーンショット 2020-08-11 15.37.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/76189976-8873-2094-4ac3-aae6a591dfe7.png">
(EXECUTABLE_NAME = PRODUCT_NAME + EXECUTABLE_PREFIX + EXECUTABLE_SUFFIX)
<img width="450" alt="スクリーンショット 2020-08-11 15.33.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/1f56a0ec-dc47-65d4-5474-8b9164500a99.png">
(PRODUCT_NAME = TARGET_NAME)
<img width="452" alt="スクリーンショット 2020-08-11 15.35.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/e2d039de-1de2-378e-1ea9-2a2d742a37cf.png">

つまり、TARGET_NAMEを変更すれば、CFBundleExecutableを含めた他の値も同じ値になります。

言い換えると、プロジェクト名を変更しなくても、CFBundleExecutableを変更できるのです！！

## 検証

では実際に、test3、のプロジェクトを例に行ってみます。
<img width="167" alt="スクリーンショット 2020-08-11 15.25.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/272ed147-2eed-89c1-6b44-0205bc22fd73.png">
PRODUCT_NAMEも、test3。
<img width="358" alt="スクリーンショット 2020-08-11 16.02.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/6e20db79-df05-ef11-0bb7-0caef270029d.png">

アプリの名前も、test3、となっています。
<img width="73" alt="スクリーンショット 2020-08-11 15.28.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/0bc649f8-aab0-8999-ccde-8a40184ffb35.png">
そして、CFBundleExecutable（EXECUTABLE_NAME）、も、test3、です
<img width="522" alt="スクリーンショット 2020-08-11 16.01.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/804697b0-ccce-a40a-e0fe-8cf0911b7f7f.png">

TARGET_NAMEを変更します。
<img width="165" alt="スクリーンショット 2020-08-11 15.25.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/413b413b-27b2-3475-fc1b-45f7ff06fd58.png">
<img width="393" alt="スクリーンショット 2020-08-11 16.02.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/112def56-dfff-c079-4dd8-b9d01670dff7.png">
<img width="82" alt="スクリーンショット 2020-08-11 15.26.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/d12d7aa7-2d70-8229-5514-9f37ac3bdc4d.png">
<img width="528" alt="スクリーンショット 2020-08-11 16.03.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/9d50f914-8d81-7417-c300-13abd1c022a1.png">

結果、TARGET_NAMEを変更することで、
・**CFBundleExecutableの値を変更**
・**アプリの名前を変更**
が行えました。

## まとめ

今回のエラーは、TARGET_NAME、を変更することで解決しました。

また、
（プロジェクト名ではなく、アプリ名を変更したい）
場合もTARGET_NAMEにお好きなアプリ名を入れるだけで実現します。

実を言うと、当記事の内容は、[アプリ道場サロン](https://community.camp-fire.jp/projects/view/281055)のオーナーである[あきお氏](https://twitter.com/akio0911)の多大なご協力で生まれたものです。

したがって、本来はあきお氏が導き出した解決方法ですが、許可をいただいて、Qiitaに投稿させていただきました。

告知ですが、僕が加入しているアプリ道場サロンにはiOSアプリ開発に関わるエンジニアや開発者の方が多数在籍しております。

もしご興味があれば、ぜひ！
https://community.camp-fire.jp/projects/view/281055

## 参考

[Xcode 7 submission error CEFBundleExecutable in the Info.plist may not contain any of these characters \ [ ] { } ( ) . + *](https://stackoverflow.com/questions/34094783/xcode-7-submission-error-cefbundleexecutable-in-the-info-plist-may-not-contain-a)
[Xcodeでビルド時にCFBundleExecutableのエラーが発生する](https://ja.stackoverflow.com/questions/62842/xcode%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E6%99%82%E3%81%ABcfbundleexecutable%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B)
[OS-Xアプリバンドルには常にInfo.plist - CFBundleExecutableが含まれていますか？](https://qastack.jp/apple/125712/do-os-x-app-bundles-always-contain-infoplist-cfbundleexecutable)