これまでの道
私のユースケースはそれでした:
- 複数のターゲット間でバージョンとビルド番号を同期しています。
- バージョンとビルド番号をターゲットのバージョンと同期しています
Settigns.bundle
- CIサーバーからビルド番号を読み取って変更しています。
ポイント1と2をターゲットビルドスクリプトとして実行し、ポイント3をCI自体のカスタムスクリプトとして実行していました。
Xcodeビルド設定内でバージョンとビルドを保存する新しい方法は、スクリプトで問題を引き起こしていました。スクリプトが値を効果的に変更できなくなったためです。少なくとも読書は可能でした。
残念ながら、Xcodeがバージョンとビルド番号をプロジェクトのビルド設定に保存することを防ぐ正当な方法を見つけることができませんでしたが、回避策を講じることができました。
ビルドまたはアーカイブが作成されると、に書き込まれた値Info.plist
が使用されることがわかります。これは、値がビルド時に置換されるため、同じビルド時に値を変更できないことを意味します。
またxcodeproj
、cli を使用してプロジェクトを変更しようとしましたが、プロジェクトに変更を加えるとビルドが停止するため、このソリューションは機能しませんでした。
結局、私が試した多くの異なるアプローチの後で、Xcodeの新しい動作に違反していない妥協点を見つけることができました。
簡潔な答え:
ターゲット事前アクションとして、スクリプトがにそれぞれの値を書き込むに実行されるCFBundleShortVersionString
とCFBundleVersion
、ターゲットのにInfo.plist
真実の源として、私はの値読み取るためにXcodeのビルド設定を使用MARKETING_VERSION
してCURRENT_PROJECT_VERSION
所望の標的のを。
このように、プロジェクト設定の値を変更すると(次のビルド/アーカイブ時に)、それらの値がに書き込まれ、Info.plist
既存のスクリプトロジックが引き続き機能する場合に許可されます。
詳細な回答
ビルドアクション時にリソースを変更する唯一の方法は、pre-action
スクリプトを使用することです。ビルドスクリプトから実行しようとすると、変更はすぐには有効にならず、ビルド/アーカイブの最後に存在しません。
ビルド前のアクションを追加するには、スキームの編集に移動します。
次に、[ビルド]および[アーカイブ]セクションを展開します。でPre-action
、Provide build and settings from
ドロップダウンをクリックして、値を読み取る真理値のターゲットのソースを選択します。
次のスクリプトを追加します。
# 1)
cd ${PROJECT_DIR}
# 2)
exec > Pruvit-Int.prebuild.sync_project_version_and_build_with_info_plists.log 2>&1
# 3)
./sync_project_version_and_build_with_info_plists.sh $MARKETING_VERSION $CURRENT_PROJECT_VERSION
scripラインは次のことを行います。
- 同期スクリプトが実行されているディレクトリに移動します
- 事前アクション中にログを書き込むことを許可します。それ以外の場合、デフォルトでは出力は表示されません。
MARKETING_VERSION
andを指定して同期スクリプトを実行しますCURRENT_PROJECT_VERSION
最後のステップは、提供の値を読み込み、独自の同期スクリプト記述することですMARKETING_VERSION
し、CURRENT_PROJECT_VERSION
それぞれのターゲット/ sまでとするたびに、他のあなたが欲しいの。
私の場合、スクリプトは次のとおりです。
#!/bin/bash
#IMPORTANT - this script must run as pre-action of each target's Build and Archive actions
version_number=$1
build_number=$2
echo "version_number is $version_number"
echo "build_number is $build_number"
#update Pruvit/Info.plist
pruvitInfoPlist="Pruvit/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $pruvitInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $pruvitInfoPlist
#update Pruvit/Settings.bundle
settingsPlist="Pruvit/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version_number" $settingsPlist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $build_number" $settingsPlist
#update BadgeCounter/Info.plist
badgeCounterInfoPlist="BadgeCounter/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $badgeCounterInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $badgeCounterInfoPlist
私は、共有を使用Info.plist
してSettings.bundle
、私はこの一度を更新する必要がありますので、私のアプリのターゲットの両方の間。
また、私は通知サービス拡張を使用しますBadgeCounter
。これは、正確に同じバージョンを持ち、それが埋め込まれているターゲットとビルドする必要があります。だから私もこれを更新します。