iOSアプリにはバージョン番号とビルド番号を設定することができます。

これらは基本的に自分の好みの番号に設定することができますが、一般的に利用されているルールにのっとって番号をつけておけば、チームで作業する場合や、自分の過去のアプリをメンテする場合に便利です。

そのほか、iTunes Connectにバイナリをアップする場合、バージョン番号とビルド番号が全く同じバイナリはアップできないという落とし穴も存在します。

今回はこのバージョン番号とビルド番号を設定する方法を説明します。

基本はプロジェクト設定で行う

バージョン番号やビルド番号はプロジェクトの一般設定で変更できます。

S 20180301 133209

▲「TARGETS」からプロジェクトを選択し「General」タブを選びます。「Identity」のなかにある「Version」がバージョン番号、「Build」がビルド番号です。

Info plist

▲設定を変更するとプロジェクトに含まれるInfo.plistに反映されます。

以下のような関係です。

Generalタブ Info.plist Info.plist(Raw Key) 備考
Version Bundle version string, short CFBundleShortVersionString 1.2とか2.3.4のような数字
Build Bundle version CFBundleVersion 1や99のような数字

Versionは「1.2」や「2.5」あるいは「3.4.5」のようなピリオドで区切られたいわゆるバージョン文字列です。対してBuildのほうは少しわかりにくいのですが基本的には(Xcodeの初期状態に従えば)単なる数字でも良い模様です。

Apple公式ドキュメント「Core Foundation Keys」ではビルド番号のCFBundleVersionに関して「ビルドバージョン番号は、負でない3つの整数で構成された文字列でなければならず、最初の整数は0より大きい」とする以下のような説明を行っています。

The build version number should be a string comprised of three non-negative, period-separated integers with the first integer being greater than zero—for example, 3.1.2. The string should only contain numeric (0-9) and period (.) characters. Leading zeros are truncated from each integer and will be ignored (that is, 1.02.3 is equivalent to 1.2.3). The meaning of each element is as follows:

この推奨に従うならば3つの数字をピリオドで結合した(バージョン番号のような)文字列を採用すべきですが、Xcodeの初期設定はそうなっておりず、単に「1」という数字になっています。

ユニークなビルド番号を生成する方法として、gitのリビジョン番号を以下のように取得する方法が知られていて、この場合も単なる数字となります。

git rev-list HEAD | wc -l

こだわりがなければ整数を使うのがわかりやすいと思います。

バージョン番号ビルド番号をアプリで表示

Info.plistに設定されている情報はメインバンドルを利用してアクセスすることができます。例えばラベルに世邸したい場合、以下のようなコードとなります。

class ViewController: UIViewController {
    @IBOutlet weak var versionLabel: UILabel!
    @IBOutlet weak var buildLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        versionLabel.text = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as? String
        buildLabel.text = Bundle.main.infoDictionary!["CFBundleVersion"] as? String
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

iTunes Connectのバージョンとの関連

iTunes Connectで設定するバージョン番号と、Xcodeで指定するバージョン番号は一致していないといけないようです。

S 20180305 161647

iTunes Connectのバージョン番号の横のクエスチョンマークをクリックすると「バージョン番号はApp Storeに表示されます。これはXcodeで使用しているバージョン番号と一致する必要があります」との情報が表示されるからです。

StackOverflowの情報にもあるように、ここで指定するバージョン番号は「Bundle Version String, short(CFBundleShortVersionString)」と同じにしておけば間違いないでしょう。

なおバージョン番号とビルド番号が全く同じ日なりをアップロードすることはできません。不具合の修正などで再アップロードが必要な場合、ビルド番号あるいはバージョン番号を変更し(普通は増加させて)から再アップロードする必要があります。

まとめ

特にCFBundleVersionは混乱しやすい情報です。自分にとってわかりやすいルールを決め、一貫して採用することをおすすめします。