[iOS/Xcode]ビルド番号設定(CFBundleVersion)の自動化設定

By | 2015 年 7 月 7 日

子供が生まれてもう1歳半だったり転職したりでドタバタとまだ冬だと思ってたらあっという間に熱い時期になり。
ぱったりと冬・夏スキーとかも行かなくなって2〜3年経ってたりする。

以前作った「出撃カウント」というアプリはレビューコメントをもらえてたりするのに放置ですみません。
つい先日やっと修正に着手したところ。近いうちに修正版の審査に上げられそう。
バトオペ自体自分がやる時間が無かったのでその間アプリもそのままという状況でした。


やりたいこと
→ CFBundleVersionの手動更新を自動化し、”gitへのコミット回数”が自動的に入るようにしたい。

バージョンは変えたくないんだけど、社内でのアプリのバージョンの区別に使ったり、AppStoreへ何回かバイナリ提出するときに前のやつとの区別のために使ったり。とか。
数値の決め方は色々あるからこそ一概にコレ!という方法があまりネット上には出てこないのかも。
もしくは手動で設定して事足りている?

色々見て回って、今のところのニーズは(B)の方法で満たされたので、忘れないうちにメモっておく。

*Info.plistファイルの場所はデフォルトのまま、プロジェクト名フォルダの直下にある前提
*ほぼほぼ EZ-NET: Build 番号の自動更新スクリプトで Info.plist そのものに書き込まないための考察 で解説されている内容が元です。大変救われました。ありがとうございます。
このやり方の経緯などはリンク先参照のこと。

(A)”PlistBuddy”を使う

後述の方法よりこっちのほうが設定は簡単。

<スクリプト内容 ~.sh>

これを Build Phases の RunScript を追加

のみ。

でもコミット後実行するたびにInfo.plistが更新されるのでコミットが必要になる。
.gitignoreで無視しちゃえばよいのかも。自分はやっていない。

<参考サイト>
XCodeで自動的にビルドバージョンのインクリメント – Qiita

iOS アプリでビルド毎に自動で CFBundleVersion をインクリメントする | Supernova

B)Info.plistをプリプロセス、pchファイルのdefineを参照させる方法

<概略>
—————-
・ビルド時に実行させるシェルスクリプトで下記ファイルを作成し、defineと定義値を書き込む
InfoPlist.pch
#define BUILD_VERSION (コミット回数)

・Info.plist のバージョン番号・ビルド番号などは上記ファイルを参照する
(key)CFBundleVersion : (value)BUILD_VERSION

<詳細>
—————-
1.ビルド時にシェルスクリプト(buildversion.sh とか)で infoPlist.pchとか作成&内容書き込むようにする
基本的には以下の2行が実行できればよいはず。

これはファイルの中身追記のみ。
”無ければつくる”もやる場合はtouchとか使えばよいのかな。

2.Build Settings > Packaging
Info.plist Preprocessor Prefix File :InfoPlist.pchのパスを指定
Preprocess Info.plist File: YES
に設定

3. Info.plistのCFBundleVersionの値を変更
CFBundleVersion(Bundle version)のValueを、直接数値入力していたのを「BUILD_VERSION」に置き換える
(InfoPlist.pchに追加した定義値にする)

4. BuildPhase > [+] で RuncScript を追加
1.で作成した.shファイルのパスを追記し、ビルド時に実行されるようにしておく

“${SRCROOT}/${PROJECT_NAME}/buildversion.sh”

<注意点>
〜.shから作成する先のパス
.shが実行される場所から見た作成先のパスを指定する。
最初、ファイル名だけ記述していたので、プロジェクトルートに InfoPlist.pch が作成されてしまっていた。

ビルドすると必ずInfoPlist.pchが更新されることになる。
追加した.pchファイルは.gitignoreへ追加して管理対象からは外せばよい。
#defineを1行書いておきたいだけで他の用途は無いので。
(プロジェクトには含めるがgit管理対象からは外しておく)

(A)の方法でやってみたんだが、元々のInfo.plistはgit管理対象としておきたかったため(B)の迂回するやり方で対応とした。
CFBundleVersion以外の項目に対しても同様の手は使えそうなので、応用していきたいところ。
参考サイトで触れられているagvtoolとか使うにはもう少々勉強が必要そうだったので未着手。

「ビルド番号=コミット回数」 なので、厳密にコミットリビジョンとかタグと突き合せた番号としたい場合はそれなりの情報を埋め込むようにすればよい。

<参考サイト>
EZ-NET: Build 番号の自動更新スクリプトで Info.plist そのものに書き込まないための考察

kishikawakatsumi/BuildNumber · GitHub

ビルド時に git のコミット回数を Info.plist のバージョン番号に設定する方法 | Cocoaの日々情報局

<コマンドラインからビルド関連情報の確認>
コマンドラインから現在のビルド設定など参照する(これで事前にINFOPLIST_FILE の設定値やパスの設定などを事前に確認した)
$ xcodebuild -showBuildSettings

あとでQiitaへ移すかも

—-
[2015-07-09追記]
後者のやり方、1.で書いた点

これはファイルの中身追記のみ。
”無ければつくる”もやる場合はtouchとか使えばよいのかな。

gitでブランチ行ったり来たりした時にBuildNumber.pchファイルが無い状態になるときがあり、毎度からファイルをつくるのが面倒になったのでここも自動化できないかと。
いうことで、ビルド実行前にtouchコマンドを走らせる設定としてみた。

xcode_touch_buildnumber_pch

ビルドターゲットの選択部分を右クリック > Edit scheme… > 上図のとおり。
「Provide build setting from」の部分をビルドする対象のターゲットにしてやらないとうまく動かなかったかもしれません。

ひとまずはこれで運用中で特に支障無し。

Category: iOS

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です