背景
- これを実施するまでは1ずつインクリメントしていたため、ビルド番号は意味のない数字だった
- 数字で何か意味のあるものでパッと浮かんだのが日時であった
- ビルド番号が日付だとTestFlightにいつアップロードしたものなのか、TestFlightアプリ上のファーストビューで見れる
実装
1.[Target]->[Edit Scheme...]->[Build]を展開->[Pre-actions]に下記を記述
#!/bin/sh
date "+%Y.%m%d.%H%M" >${PROJECT_DIR}/build_number.txt
2.プロジェクトファイルの[TARGETS]からターゲットを選択
3.[Build Phases]タブを選択
4.[+]をクリックし、[New Run Script Phase]を選択
5.下記を記述
#!/bin/sh
plistBuddy="/usr/libexec/PlistBuddy"
infoPlist="${TEMP_DIR}/Preprocessed-Info.plist"
buildNumber=$(cat "${PROJECT_DIR}/build_number.txt")
$plistBuddy -c "Set :CFBundleVersion $buildNumber" $infoPlist
6..gitignore
にbuild_number.txt
を追記
説明
なぜPre-actionを使用するのか
最初はすべてのスクリプトをBuild Phaseに記載していたがWatchアプリのビルドが失敗する問題が発生。
アプリ本体とWatchアプリのビルド番号は同じである必要があるように見える。
(TodayExtensionやNotificationServiceExtensionはアプリ本体のビルド番号と同じになっていなくともビルドは通る。)
各ターゲットのビルドが並列で動いているので、アプリ本体のターゲットが先にビルドされた時しかビルドが通らない。
Pre-actionはどのビルド時よりも早いタイミングで任意の処理を動かせるので、そのタイミングでtxtファイルにビルド番号を保存しておくようにした。
参考
DeepL翻訳で翻訳。
ビルドバージョン番号は、最初の整数をゼロよりも大きい値にして、3 つの非負の周期で区切られた整数で構成された文字列にする必要があります。文字列には、数字 (0-9) とピリオド (.) のみを含める必要があります。先頭のゼロは各整数から切り捨てられ、無視されます(つまり、1.02.3は1.2.3と同じです)。各要素の意味は以下の通りです。
最初の数字は最新のメジャーリリースを表し、最大4桁の長さに制限されています。
2 番目の数字は最新の重要なリビジョンを表し、最大 2 桁の長さに制限されています。
3番目の数字は最新のマイナーバグフィックスを表し、最大2桁の長さに制限されています。
3 番目の数字の値が 0 の場合、それと 2 番目のピリオドを省略できます。