バージョン番号とビルド番号の付け方について
ターゲットのサマリーの"Version"はInfo.plistの"Bundle versions string, short" (CFBundleShortVersionString)、"Build"は"Bundle Version (CFBundleVersion)"に相当します。
バージョン番号とビルド番号の使い方の流儀はいろいろあり、プロジェクトにあった方法を選べばよいわけですが、私の場合は上のQ&Aページで説明されているのとほぼ同じように、次のようなルールで付けることにしました。
バージョン番号は、
{メジャーバージョン}.{マイナーバージョン}.{リビジョン}
- メジャーバージョン … 大幅なデザインの変更など
- マイナーバージョン … 新機能の追加
- リビジョン … バグ修正やマイナーな改善
のように決めました。
ビルド番号は、ビルドの度に増やしていき、バージョン番号を上げたときに0にリセットすることにしました。
ビルド番号をビルドの度に自動的に増やす方法
ビルド番号をビルドの度に自動的に増やすには、XcodeのビルドフェーズにアプリのInfo.plistを書き換えるスクリプトを追加します。
まず、Xcodeでプロジェクトを開き、ターゲットの設定で"Build Phases"を選びます。

次に、右下の"Add Build Phase"ボタンを押して、"Add Run Script"を選びます。
"Run Script"というビルドフェーズが追加されたら、それを"Copy Bundle Resources"よりも上にドラッグして移動します。
"Run Script"を開いて、スクリプト欄に、次のスクリプトをコピー&ペーストします。
#!/bin/bash buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") buildNumber=$(($buildNumber + 1)) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
最後に、ターゲットのサマリーで、ビルド番号を0(又は適当な数値)にリセットしておきます。
これで、ビルドする度にビルド番号が1ずつ増えていくようになります。
プログラムでバージョン番号とビルド番号を取得して例えばUILabelに表示するには、次のようにします。
NSString *versionNum = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *buildNum = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
versionLabel.text = [NSString stringWithFormat:@"%@ Build %@", versionNum, buildNum];
ただ、このままだとどうしてもビルド後のターゲットのサマリーで表示されるビルド番号と、実行時に取得できる番号が1つずれてしまいました。どうやら、Run Scriptフェーズでビルド番号を上げたものが保存される前に、アプリのInfo.plistファイルがバンドルにコピーされてしまうようです。。。このへんはプログラム内で1つ増やすか、ビルド前の番号がそのビルドのビルド番号だと思うようにするしかなさそう。
ビルド番号が毎回変わってそれをアプリ内で表示できるようにしておけば、テスト用にデプロイした実行ファイルがどの時期にビルドしたものか区別できて便利ですね。





