Xcode 11からアプリバージョンがstaticな値から環境変数を参照するようになっている

2020.08.19

背景

Settings.bundleのRoot.plistにアプリのバージョンを書き出すことでiOSの「設定」アプリから対象のアプリのバージョンを確認できるようにしていました。 具体的にはBuild Phasesで以下のスクリプトを実行していました。

APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH)
BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH)
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${APP_VERSION}(${BUILD_NUMBER})" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

Settings.bundleについてはこちらの記事をご覧ください。

[iOS] アプリの設定画面にバージョン表記と謝辞を自動で設定する

Xcode 11でアプリのバージョンを変えたら意図しない表示に...

Xcodeのバージョンを11に上げ、リリースのためにTARGET > General > でいつものようにVersionBuild を変更しました。

アプリをインストールしたところ、バージョン表記が以下のような意図しないものになってしまいました。 見覚えのない環境変数らしきものがそのまま出てしまっていますね。

何が変わったのか

Xcode 11になって何が変わったのでしょうか。 VersionBuild を変更した時のInfo.plistの差分を見てみました。

バージョン変更前

バージョン変更後

Bundle versions string, short(CFBundleShortVersionString))の値がstaticな値からMARKETING_VERSIONBundle version(CFBundleVersion)の値がstaticな値からCURRENT_PROJECT_VERSIONを参照するように変わっていました。 つまり、Xcode 11からそれぞれの環境変数を参照するようになりました。

TARGET > Build Settings > Versioningを確認すると設定したVersionBuildの値が反映されていました。

スクリプトを修正

原因がわかったのでスクリプトを修正していきます。 MARKETING_VERSIONCURRENT_PROJECT_VERSIONを参照するようにするだけです。

/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${MARKETING_VERSION}(${CURRENT_PROJECT_VERSION})" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

スクリプト修正後の結果はこちらです。ちゃんと表示されました。

おわりに

ということでXcode 11でビルドしてみて少しハマったアプリのバージョンについて記事にしてみました。 Xcodeのバージョンを上げた場合はソースコードだけでなくこういった環境周りの変更も意識していきましょう(自戒

開発環境

  • Xcode Version 11.3.1 (11C504)
  • macOS Catalina Version 10.15.6

参考