App ExtensionのBundle Versionを自動でアプリのBundle Versionに合わせる


はじめに

iOSアプリのアップデートをリリースするときにバージョン番号を更新しますが、
App Extensionがある場合はそちらのバージョンも更新する必要があるかと思います。

App Extensionのバージョン更新は、忘れがちなので自動で更新するようにしてみます。

やること

メインのターゲットのアプリバージョンを更新して、ビルドすると
App Extensionのバージョンと設定アプリに表示するバージョンが更新されるようスクリプトを追加します。

※ 設定アプリに情報を表示するのに、Settings Bundleを使用しますが、
 本記事ではSettings Bundleの詳細は割愛します(>人<)

Run Scriptを作成

今回のサンプルプロジェクトの構成は、以下のとおりです。

  1. Build PhasesにRun Script Phaseを追加します。

  2. 追加した「Run Script」を分かりやすい名前にリネームします。
    今回は、「Refresh App Versions」とします。

  3. スクリプトを書いていきます。
    Run Scriptを開いて、スクリプトを書いていきます。

今回追加するスクリプトは以下のとおりです。


APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH)
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue ${APP_VERSION}" "${PRODUCT_NAME}/Resources/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${APP_VERSION}" "${SRCROOT}/DemoAppNotificationServiceExtension/Info.plist"

これで、ビルドをするとInfo.plistのCFBundleShortVersionStringの値が設定アプリと、App ExtensionのInfo.plistに書き込まれるようになります \(^ω^)/

※ 2, 3行目には、出力先のplistのPATHを含んでいるので、プロジェクトの構成ごとに調整が必要ですm(_ _)m

スクリプトの内容について

スクリプトの内容について簡単に説明します。

APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH)

1行目は、Info.plistのCFBundleShortVersionStringの値を変数APP_VERSIONに保持しています。
 PlistBuddyはplistを操作するプログラムです。(Macにデフォルトで入っています!)
 $PRODUCT_SETTINGS_PATH はplistのPATHを示す環境変数です。

/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue ${APP_VERSION}" "${PRODUCT_NAME}/Resources/Settings.bundle/Root.plist"

2行目は、APP_VERSIONの値をSettings.bundle/Root.plist
PreferenceSpecifiersの1番目のdictionaryのDefaultValueキーの値に書き込んでいます。
(PreferenceSpecifiersはdictionaryのarrayです。arrayなので、indexは0始まりです。)

/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${APP_VERSION}" "${SRCROOT}/DemoAppNotificationServiceExtension/Info.plist"

3行目は、2行目とほとんど同じです。
書き込み先がApp ExtensionのInfo.plistに変わっているだけです(`・ω・´)

さいごに

メインのターゲットのアプリバージョンを更新してビルドしたら、
App Extensionのバージョンと設定アプリに表示するバージョンが更新されるようになりました!

App Extensionが複数ある場合でも、同様にスクリプトの行を追加していけばまとめて更新できます!