Je voudrais inclure la version de l'application et la révision interne, quelque chose comme 1.0.1 (r1243), dans le paquet de paramètres de mon application.
Le fichier Root.plist contient un fragment comme celui-ci ...
<dict>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
<key>Title</key>
<string>Version</string>
<key>Key</key>
<string>version_preference</string>
<key>DefaultValue</key>
<string>VersionValue</string>
<key>Values</key>
<array>
<string>VersionValue</string>
</array>
<key>Titles</key>
<array>
<string>VersionValue</string>
</array>
</dict>
et je voudrais remplacer la chaîne "VersionValue" au moment de la construction.
J'ai un script qui peut extraire le numéro de version de mon référentiel, ce dont j'ai besoin est un moyen de traiter (pré-traiter) le fichier Root.plist, au moment de la construction, et de remplacer le numéro de révision sans affecter le fichier source.
la source
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
La solution de mon paresseux était de mettre à jour le numéro de version de mon code d'application. Vous pouvez avoir une valeur par défaut (ou vide) dans le Root.plist puis, quelque part dans votre code de démarrage:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; [[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];
Le seul problème est que votre application devrait être exécutée au moins une fois pour que la version mise à jour apparaisse dans le panneau des paramètres.
Vous pouvez pousser l'idée plus loin et mettre à jour, par exemple, un compteur du nombre de fois où votre application a été lancée ou d'autres informations intéressantes.
la source
CFBundleShortVersionString
etCFBundleVersion
à la même valeur,CFBundleShortVersionString
c'est en fait ce qu'Apple veut que vous considériez comme votre version publiée , ce que vous montrez aux utilisateurs.CFBundleVersion
pourrait potentiellement être un numéro de version interne, que vous ne devriez probablement pas montrer aux utilisateurs (s'il diffère).Basé sur la réponse de @ Quinn, voici le processus complet et le code de travail que j'utilise pour ce faire.
Remplacez le contenu par:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PreferenceSpecifiers</key> <array> <dict> <key>Title</key> <string>About</string> <key>Type</key> <string>PSGroupSpecifier</string> </dict> <dict> <key>DefaultValue</key> <string>DummyVersion</string> <key>Key</key> <string>version_preference</string> <key>Title</key> <string>Version</string> <key>Type</key> <string>PSTitleValueSpecifier</string> </dict> </array> <key>StringsTable</key> <string>Root</string> </dict> </plist>
Créez une phase de construction Run Script , déplacez-vous pour être après la phase Copier les ressources de l'ensemble . Ajoutez ce code:
cd "${BUILT_PRODUCTS_DIR}" buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}" ) /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $buildVersion" "${WRAPPER_NAME}/Settings.bundle/Root.plist"
Remplacez MyAppName par le nom de votre application réelle et le 1 après PreferenceSpecifiers pour être l'index de votre entrée de version dans les paramètres. L'exemple ci-dessus Root.plist l'a à l'index 1.
la source
buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:3:DefaultValue $buildVersion" "${SRCROOT}/Settings.bundle/Root.plist"
${INFOPLIST_PATH}
pour le chemin info plistUtilisation du plist de Ben Clayton https://stackoverflow.com/a/12842530/338986
Ajouter
Run script
avec l'extrait suivant aprèsCopy Bundle Resources
.version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE") build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"
Ajout
CFBundleVersion
en plus deCFBundleShortVersionString
. Il émet une version comme celle-ci:En écrivant à
$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist
au lieu de celui en, vous$SRCROOT
avez certains avantages.Settings.bundle
dans$SRCROOT
. Le chemin peut varier.Test sur Xcode 7.3.1
la source
Sur la base de l'exemple ici , voici le script que j'utilise pour mettre à jour automatiquement le numéro de version du bundle de paramètres:
#! /usr/bin/env python import os from AppKit import NSMutableDictionary settings_file_path = 'Settings.bundle/Root.plist' # the relative path from the project folder to your settings bundle settings_key = 'version_preference' # the key of your settings version # these are used for testing only info_path = '/Users/mrwalker/developer/My_App/Info.plist' settings_path = '/Users/mrwalker/developer/My_App/Settings.bundle/Root.plist' # these environment variables are set in the XCode build phase if 'PRODUCT_SETTINGS_PATH' in os.environ.keys(): info_path = os.environ.get('PRODUCT_SETTINGS_PATH') if 'PROJECT_DIR' in os.environ.keys(): settings_path = os.path.join(os.environ.get('PROJECT_DIR'), settings_file_path) # reading info.plist file project_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_path) project_bundle_version = project_plist['CFBundleVersion'] # print 'project_bundle_version: '+project_bundle_version # reading settings plist settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path) for dictionary in settings_plist['PreferenceSpecifiers']: if 'Key' in dictionary and dictionary['Key'] == settings_key: dictionary['DefaultValue'] = project_bundle_version # print repr(settings_plist) settings_plist.writeToFile_atomically_(settings_path, True)
Voici le Root.plist que j'ai dans Settings.bundle:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PreferenceSpecifiers</key> <array> <dict> <key>Title</key> <string>About</string> <key>Type</key> <string>PSGroupSpecifier</string> </dict> <dict> <key>DefaultValue</key> <string>1.0.0.0</string> <key>Key</key> <string>version_preference</string> <key>Title</key> <string>Version</string> <key>Type</key> <string>PSTitleValueSpecifier</string> </dict> </array> <key>StringsTable</key> <string>Root</string> </dict> </plist>
la source
NSDictionary
( et je ne savais pas que cela vous donnait un accès aussi facile aux fichiers plist, non plus)gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
Les autres réponses ne fonctionnent pas correctement pour une raison: la phase de création du script d'exécution n'est pas exécutée avant que le pack de paramètres n'ait été emballé. Donc, si votre version d'Info.plist est 2.0.11 et que vous la mettez à jour vers 2.0.12, puis compilez / archivez votre projet, le bundle Paramètres indiquera toujours 2.0.11. Si vous ouvrez le bundle de paramètres Root.plist, vous pouvez voir que le numéro de version n'est pas mis à jour avant la FIN du processus de génération. Vous pouvez à nouveau créer le projet pour mettre à jour correctement l'ensemble des paramètres, ou ajouter le script à une phase de pré-construction à la place ...
Ajoutez votre script à la zone de texte. Le script suivant a fonctionné pour moi. Vous devrez peut-être modifier les chemins pour qu'ils correspondent à la configuration de votre projet:
versionString = $ (/ usr / libexec / PlistBuddy -c "Print CFBundleVersion" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")
/ usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "set PreferenceSpecifiers: 0: DefaultValue $ versionString"
Cela exécutera correctement le script AVANT que l'ensemble de paramètres ne soit emballé pendant le processus de construction / d'archivage. Si vous ouvrez le bundle Settings Root.plist et que vous générez / archivez votre projet, vous verrez maintenant que le numéro de version est mis à jour au début du processus de construction et votre bundle Settings affichera la version correcte.
la source
Avec Xcode 11.4, vous pouvez utiliser les étapes suivantes pour afficher la version de l'application dans l'ensemble de paramètres de votre application.
Ensemble
$(MARKETING_VERSION)
et$(CURRENT_PROJECT_VERSION)
variablesRemarque: si des variables
$(MARKETING_VERSION)
et$(CURRENT_PROJECT_VERSION)
apparaissent pour les clésBundle version string (short)
etBundle version
dans Info.plist , vous pouvez ignorer les étapes suivantes et passer à la section suivante.0.1.0
) et changez le contenu du champ Construire en une nouvelle valeur (par exemple12
). Ces 2 changements vont créer$(MARKETING_VERSION)
et$(CURRENT_PROJECT_VERSION)
variables dans Info.plist fichier.Créer et configurer un ensemble de paramètres
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PreferenceSpecifiers</key> <array> <dict> <key>DefaultValue</key> <string></string> <key>Key</key> <string>version_preference</string> <key>Title</key> <string>Version</string> <key>Type</key> <string>PSTitleValueSpecifier</string> </dict> </array> <key>StringsTable</key> <string>Root</string> </dict> </plist>
Ajouter un script d'exécution
version="$MARKETING_VERSION" build="$CURRENT_PROJECT_VERSION" /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
Démarrer l'application
Sources
la source
Set: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
($build)
J'ai réussi à faire ce que je voulais en utilisant le porject open source pListcompiler ( http://sourceforge.net/projects/plistcompiler ).
En utilisant ce compilateur, vous pouvez écrire le fichier de propriétés dans un fichier .plc en utilisant le format suivant:
plist { dictionary { key "StringsTable" value string "Root" key "PreferenceSpecifiers" value array [ dictionary { key "Type" value string "PSGroupSpecifier" key "Title" value string "AboutSection" } dictionary { key "Type" value string "PSTitleValueSpecifier" key "Title" value string "Version" key "Key" value string "version" key "DefaultValue" value string "VersionValue" key "Values" value array [ string "VersionValue" ] key "Titles" value array [ string "r" kRevisionNumber ] } ] } }
J'ai eu une phase de construction de script d'exécution personnalisée qui extrayait ma révision de référentiel dans un fichier .h comme décrit par brad-larson ici .
Le fichier plc peut contenir des directives de préprocesseur, telles que #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, les variables d'environnement xcode. J'ai donc pu référencer la variable kRevisionNumber en ajoutant la directive suivante
#include "Revision.h"
J'ai également ajouté une phase de création de script personnalisé à ma cible xcode pour exécuter le compilateur plc à chaque fois que le projet est en cours
/usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
Et c'était tout!
la source
Mon exemple de travail basé sur la réponse de @Ben Clayton et les commentaires de @Luis Ascorbe et @Vahid Amiri:
Ajoutez un ensemble de paramètres à la racine de votre projet. Ne le renommez pas
Ouvrez Settings.bundle / Root.plist en tant que SourceCode
Remplacez le contenu par:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PreferenceSpecifiers</key> <array> <dict> <key>DefaultValue</key> <string></string> <key>Key</key> <string>version_preference</string> <key>Title</key> <string>Version</string> <key>Type</key> <string>PSTitleValueSpecifier</string> </dict> </array> <key>StringsTable</key> <string>Root</string> </dict> </plist>
Ajoutez le script suivant à la section Génération, Pré-actions du schéma de projet (cible)
version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE") build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
Construire et exécuter le schéma actuel
la source
Les réponses ci-dessus ne fonctionnaient pas pour moi, j'ai donc créé mon script personnalisé.
Cela met à jour dynamiquement l'entrée de Root.plist
Utilisez le script d'exécution ci-dessous. Fonctionnera à coup sûr vérifié dans xcode 10.3.
"var buildVersion" est la version à afficher dans le titre.
Et le nom de l'identifiant est "var version" ci-dessous pour le titre dans settings.bundle Root.plist
cd "${BUILT_PRODUCTS_DIR}" #set version name to your title identifier's string from settings.bundle var version = "Version" #this will be the text displayed in title longVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}") shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${TARGET_BUILD_DIR}/${INFOPLIST_PATH}) buildVersion="$shortVersion.$longVersion" path="${WRAPPER_NAME}/Settings.bundle/Root.plist" settingsCnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${path} | grep "Dict"|wc -l` for (( idx=0; idx<$settingsCnt; idx++ )) do #echo "Welcome $idx times" val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Key" ${path}` #echo $val #if ( "$val" == "Version" ) if [ $val == "Version" ] then #echo "the index of the entry whose 'Key' is 'version' is $idx." # now set it /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $buildVersion" $path # just to be sure that it worked ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" $path` #echo 'PreferenceSpecifiers:$idx:DefaultValue set to: ' $ver fi done
Exemple d'entrée dans Root.plist
<dict> <key>Type</key> <string>PSTitleValueSpecifier</string> <key>Title</key> <string>Version</string> <key>DefaultValue</key> <string>We Rock</string> <key>Key</key> <string>Version</string> </dict>
la source
Je pense que vous pouvez le faire en utilisant une manière similaire à ce que je décris dans cette réponse (basée sur ce post ).
Tout d'abord, vous pouvez faire de VersionValue une variable dans Xcode en la renommant en $ {VERSIONVALUE}. Créez un fichier nommé versionvalue.xcconfig et ajoutez-le à votre projet. Accédez à la cible de votre application et accédez aux paramètres de génération de cette cible. Je pense que vous devez ajouter VERSIONVALUE en tant que paramètre de construction défini par l'utilisateur. Dans le coin inférieur droit de cette fenêtre, modifiez la valeur Basé sur sur «versionvalue».
Enfin, accédez à votre cible et créez une phase de génération Run Script. Inspectez cette phase Exécuter le script et collez votre script dans le champ de texte Script. Par exemple, mon script pour marquer mon paramètre BUILD_NUMBER avec la version actuelle de Subversion est le suivant:
REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig
Cela devrait suffire à remplacer la variable lorsque ces valeurs changent dans votre projet.
la source
Pour moi, c'était la solution la plus simple:
Ajouter une nouvelle phase de création de script avant l'étape Copier les ressources de l'ensemble
Coquille:
/usr/bin/env python
Contenu:
#! /usr/bin/env python import os from AppKit import NSMutableDictionary # Key to replace settings_key = 'version_preference' # the key of your settings version # File path settings_path = os.environ.get('SRCROOT') + "/TheBeautifulNameOfYourOwnApp/Settings.bundle/Root.plist" # Composing version string version_string = os.environ.get('MARKETING_VERSION') + " (" + os.environ.get('CURRENT_PROJECT_VERSION') + ")" # Reading settings plist settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path) for dictionary in settings_plist['PreferenceSpecifiers']: if 'Key' in dictionary and dictionary['Key'] == settings_key: dictionary['DefaultValue'] = version_string # Save new settings settings_plist.writeToFile_atomically_(settings_path, True)
la source