XCodeでビルドしたら「The application's Info.plist does not contain CFBundleShortVersionString.」と出た時の対処



ozvision Advent Calendar 2019
に参加させて頂きました。（日にち過ぎてしまったけど…）

[株式会社オズビジョン](https://www.oz-vision.co.jp/)の開発チームに業務委託として参加しています村上です。（以前は社員でしたが出戻りました）

最近リリースされたハピタスアプリ（ネットショッピングなどでポイントがたまるアプリ）の改修などをしています。

よかったら使ってみてください。
[iOS版ハピタスアプリ](https://apps.apple.com/jp/app/id1475444626?&mt=8)
[Android版ハピタスアプリ](https://play.google.com/store/apps/details?id=jp.hapitas.appnativeside)

[Web版ハピタスはこちら](https://hapitas.jp/)

業務でハマったことを書いていきます。

---

XCodeでスマホアプリをビルドしてシミュレーターを起動しようとしたら以下のようなエラーが出ました。

<img width="427" alt="スクリーンショット 2019-12-26 16.51.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138682/29fe57bf-efe9-d2cf-4fa7-d443d38c2674.png">

解決までの過程を書きます。

# エラーの内容「The application's Info.plist does not contain CFBundleShortVersionString.」

表示されたダイアログのDetailsボタンを押すと以下のようなメッセージ。

```
Details

Failed to install the requested application
Domain: NSPOSIXErrorDomain
Code: 22
Failure Reason: The application's Info.plist does not contain CFBundleShortVersionString.
Recovery Suggestion: Ensure your bundle contains a CFBundleShortVersionString.
...
}
--
```

翻訳するとこう。

```
失敗の理由：アプリケーションのInfo.plistにCFBundleShortVersionStringが含まれていません。
回復の提案：バンドルにCFBundleShortVersionStringが含まれていることを確認してください。
```

ふむふむ。

# Info.plistとは？

と思い調べたら以下のWebページが見つかりました。
[About Information Property List Files](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html)

Google翻訳します。

> 情報プロパティリストファイルは、バンドルされた実行可能ファイルの重要な構成情報を含む構造化テキストファイルです。通常、ファイル自体はUnicode UTF-8エンコードを使用してエンコードされ、コンテンツはXMLを使用して構造化されます。ルートXMLノードは辞書であり、その内容はバンドルのさまざまな側面を記述するキーと値のセットです。システムはこれらのキーと値を使用して、アプリとその構成方法に関する情報を取得します。そのため、バンドルされているすべての実行可能ファイル（プラグイン、フレームワーク、アプリ）には、情報プロパティリストファイルが必要です。

>慣例により、情報プロパティリストファイルの名前はInfo.plistです。このファイルの名前は大文字と小文字が区別され、最初の大文字が必要Iです。iOSアプリでは、このファイルはバンドルディレクトリの最上位にあります。macOSバンドルでは、このファイルはバンドルのContentsディレクトリにあります。Xcodeは通常、適切なタイプのプロジェクトを作成すると、このファイルを自動的に作成します。

Info.plistは…

```
・自動的に作られる。
・XMLファイル。
・アプリの構成情報が書いてある。
```

なるほど。自動的に作られるのに何でエラー出るんだろう。
さては誰か消した？
さもなくばXCodeのバグ？

あとは…

# CFBundleShortVersionStringとは？

公式ドキュメントがありました。

[CFBundleShortVersionString - Information Property List | Apple Developer Documentation](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring)

翻訳します。

>The release or version number of the bundle.
>バンドルのリリースまたはバージョン番号。

> このキーは、バンドルのバージョンのユーザーに表示される文字列です。必要な形式は、10.14.1など、3つのピリオド区切りの整数です。文字列には、数字（0〜9）とピリオドのみを含めることができます。

> 各整数は、[ メジャー ]。[ マイナー ]。[ パッチ ] の形式でリリースに関する情報を提供します。

> メジャー：メジャーリビジョン番号。
> マイナー：マイナーリビジョン番号。
> パッチ：メンテナンスリリース番号。
> このキーはシステム全体で使用され、バンドルのバージョンを識別します。

だそうです。

`CFBundleShortVersionString`は…

```
ユーザーに表示されるバージョン文字列。
```

でした。

# Stack Overflowの投稿を発見

同じようなエラーで困ってる人いました。

[ios - Cannot run application on simulator after installing Xcode 11 - CFBundleVersion error - Stack Overflow](https://stackoverflow.com/questions/56450295/cannot-run-application-on-simulator-after-installing-xcode-11-cfbundleversion)

コメントを見ると、
> `CFBundleShortVersionString`の形式がおかしいんじゃないか？`12.4.2`みたいな形式になってる？

と言う感じに言われている。

なるほど。Info.plistを確認してみる。

```Info.plist
...
	<key>CFBundleShortVersionString</key>
	<string>$(MARKETING_VERSION)</string>
...
```

`MARKETING_VERSION`と言う変数を参照している。これは何かな。

# MARKETING_VERSIONとは？

公式のドキュメントは見つかりませんでしたが、
どうやらXCodeで設定する項目のようです。

TARGETSからビルド対象のアプリを選び、`BuildSetting`タブのVersioningのなかに項目がありました。
XCodeバージョンは11.3です。

<img width="358" alt="スクリーンショット 2019-12-26 17.30.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138682/77b23d74-0e1a-2c65-05df-91e82f037577.png">

何も設定されてませんでした。

# 解決：MARKETING_VERSIONに1.0.0を設定して再ビルドする

とりあえずMARKETING_VERSIONに`1.0.0`と入れて、Clean（Productメニュ→Clean）してからビルドし直したら…

無事シミュレーターで起動しました！

<img width="386" alt="スクリーンショット 2019-12-26 18.12.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138682/b8db5c88-f401-b117-00db-fe1045440ff6.png">

しかし前はこんなエラー出なかったのに。
XCodeバージョン上げたタイミングで発生したのだろうか。
わからず終いです。

# まとめ

よくわからないエラーメッセージが表示された時にとりあえずググるのは基本ですが、エラーメッセージの中の一つ一つの単語の意味などもきちんと調べておくと、次回から応用が効きやすいと思います。

あと調べるときはできるだけ公式サイトを探すのが良いと思います。

QiitaやStack Overflowだけで調べてしまうと、情報が古かったり間違っていたりする場合もあるので注意しましょう。
（Qiitaでこれを書くのもあれですが）

以上となります！