バージョン番号とビルド番号の付け方について
ターゲットのサマリーの"Version"はInfo.plistの"Bundle versions string, short" (CFBundleShortVersionString)、"Build"は"Bundle Version (CFBundleVersion)"に相当します。
バージョン番号とビルド番号の使い方の流儀はいろいろあり、プロジェクトにあった方法を選べばよいわけですが、私の場合は上のQ&Aページで説明されているのとほぼ同じように、次のようなルールで付けることにしました。
バージョン番号は、
{メジャーバージョン}.{マイナーバージョン}.{リビジョン}
- メジャーバージョン … 大幅なデザインの変更など
- マイナーバージョン … 新機能の追加
- リビジョン … バグ修正やマイナーな改善
のように決めました。
ビルド番号は、ビルドの度に増やしていき、バージョン番号を上げたときに0にリセットすることにしました。
2012/02/29 追記
Appleのドキュメントには、CFBundleShortVersionStringとCFBundleVersionに書くべき内容や形式が事細かに規定されていました。
CFBundleShortVersionString specifies the release version number of the bundle, which identifies a released iteration of the application. The release version number is a string comprised of three period-separated integers. The first integer represents major revisions to the application, such as revisions that implement new features or major changes. The second integer denotes revisions that implement less prominent features. The third integer represents maintenance releases.
CFBundleShortVersionStringの方には、ピリオドで区切られた3つの整数で表されたリリースされたアプリケーションに固有の番号を指定するとのこと。(上に書いたのと同じ流儀ですね。)
CFBundleVersionの方は、次のように書かれていました。
CFBundleVersion specifies the build version number of the bundle, which identifies an iteration (released or unreleased) of the bundle. This is a monotonically increased string, comprised of one or more period-separated integers. This key is not localizable.
こちらは、リリースされたかどうかにかかわらず単調に増加する、ピリオドで区切られた一つ以上の数字とのこと。なので、下でご紹介する方法で自動的に増やしていくのは正解ですが、リリースのバージョン番号を上げたときでもビルド番号全体を0にリセットしてはいけません。App Storeにサブミットするときのバリデーションでは、この値を見ているようなので、バージョン番号を上げても、ビルド番号が前回よりも小さい値になっているとバリデーションに合格できなくなってしまいます。
ビルド番号をビルドの度に自動的に増やす方法
ビルド番号をビルドの度に自動的に増やすには、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"
最後に、ターゲットのサマリーで、ビルド番号を適当な数値にセットしておきます。
これで、ビルドする度にビルド番号が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つ増やすか、ビルド前の番号がそのビルドのビルド番号だと思うようにするしかなさそう。
ビルド番号が毎回変わってそれをアプリ内で表示できるようにしておけば、テスト用にデプロイした実行ファイルがどの時期にビルドしたものか区別できて便利ですね。





