La route jusqu'ici
Mon cas d'utilisation était que:
- Je synchronise la version et les numéros de build sur plusieurs cibles.
- Je synchronise la version et les numéros de build avec ceux de la cible
Settigns.bundle
- Je lis et modifie le numéro de build d'un serveur CI.
J'avais l'habitude d'exécuter les points 1 et 2 en tant que script de build cible et le point 3 en tant que script personnalisé sur le CI lui-même.
La nouvelle façon de stocker la version et la génération dans les paramètres de génération Xcode posait des problèmes avec les scripts, car ils n'étaient plus en mesure de modifier efficacement les valeurs. Au moins, la lecture était possible.
Malheureusement, je n'ai pas pu découvrir un moyen légitime d'empêcher Xcode de stocker la version et les numéros de build dans les paramètres de construction du projet, mais j'ai réussi à créer une solution de contournement.
Il s'avère que lorsqu'une construction ou une archive est effectuée, la valeur écrite dans le Info.plist
est utilisée. Cela signifie que la valeur est substituée pendant la construction, ce qui ne nous permet pas de la modifier pendant la même construction.
J'ai également essayé de modifier le projet à l'aide de xcodeproj
cli, mais toute modification apportée au projet entraînait l'arrêt de toutes les versions, donc cette solution ne fonctionnait pas.
Finalement, après beaucoup d'approches différentes que j'ai essayées, j'ai finalement réussi à trouver un compromis qui ne violait pas le nouveau comportement du Xcode.
Réponse courte:
En tant que pré-action cible, un script est exécuté qui écrit les valeurs respectives dans CFBundleShortVersionString
et CFBundleVersion
vers la cibleInfo.plist
Comme source de vérité, j'utilise les paramètres de construction de Xcode pour lire les valeurs de MARKETING_VERSION
et CURRENT_PROJECT_VERSION
de la cible souhaitée.
De cette façon, lorsque vous modifiez les valeurs des paramètres du projet - lors de la prochaine génération / archive - elles seront écrites dans le Info.plist
, permettant à toute logique de script existante de continuer à fonctionner.
Réponse détaillée
La seule façon de modifier une ressource lors d'une action de génération est d'utiliser un pre-action
script. Si vous essayez de le faire à partir d'un script de build - les modifications ne prendront pas effet immédiatement et ne seront pas présentes à la fin de la build / archive.
Pour ajouter une action de pré-construction - allez dans le schéma d'édition.
Développez ensuite les sections Build et Archive. Sous Pre-action
, cliquez sur le Provide build and settings from
menu déroulant et sélectionnez la source de cible de vérité à partir de laquelle vous souhaitez lire les valeurs.
Ajoutez le script suivant:
# 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
Les lignes de script font ce qui suit:
- Accédez au répertoire où se trouve le script de synchronisation afin de l'exécuter
- Permet à un journal d'être écrit pendant la pré-action, sinon toute sortie est désactivée par défaut
- Exécutez le script de synchronisation en fournissant le
MARKETING_VERSION
etCURRENT_PROJECT_VERSION
La dernière étape consiste à écrire votre propre script de synchronisation qui lit les valeurs du fourni MARKETING_VERSION
et CURRENT_PROJECT_VERSION
à la cible / s respectifs et chaque fois que vous le souhaitez.
Dans mon cas, le script est le suivant:
#!/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
J'utilise partagé Info.plist
et Settings.bundle
entre mes deux cibles d'application, donc je dois le mettre à jour une fois.
J'utilise également une extension de service de notification BadgeCounter
, qui doit avoir exactement la même version et être la cible dans laquelle elle est intégrée. Je mets donc cela à jour également.