Comment puis-je afficher la révision de la version de l’application dans le groupe de parameters de mon application?

J’aimerais inclure la version de l’application et la révision interne, quelque chose comme 1.0.1 (r1243), dans le groupe de parameters de mon application.

Le fichier Root.plist contient un fragment comme celui-ci …

 Type PSTitleValueSpecifier Title Version Key version_preference DefaultValue VersionValue Values  VersionValue  Titles  VersionValue   

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.

Il y a une autre solution qui peut être beaucoup plus simple que l’une des réponses précédentes. Apple intègre un outil de ligne de commande appelé PlistBuddy dans la plupart de ses programmes d’installation et l’a inclus dans Leopard à l’ /usr/libexec/PlistBuddy .

Puisque vous voulez remplacer VersionValue , en supposant que vous ayez la valeur de version extraite dans $newVersion , vous pouvez utiliser cette commande:

 /usr/libexec/PlistBuddy -c "Set :VersionValue $newVersion" /path/to/Root.plist 

Pas besoin de jouer avec des expressions sed ou régulières, cette approche est assez simple. Voir la page de manuel pour des instructions détaillées. Vous pouvez utiliser PlistBuddy pour append, supprimer ou modifier une entrée dans une liste de propriétés. Par exemple, un de mes amis a blogué sur l’ incrémentation des numéros de build dans Xcode à l’ aide de PlistBuddy.

Remarque: Si vous fournissez uniquement le chemin du plist, PlistBuddy entre en mode interactif, vous pouvez donc émettre plusieurs commandes avant de décider d’enregistrer les modifications. Je recommande définitivement de le faire avant de le déposer dans votre script de construction.

La solution de mon homme paresseux consistait à mettre à jour le numéro de version de mon code d’application. Vous pourriez avoir une valeur par défaut (ou vide) dans le Root.plist, puis quelque part dans votre code de démarrage:

 NSSsortingng *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; [[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"]; 

Le seul problème est que votre application doit être exécutée au moins une fois pour que la version mise à jour apparaisse dans le panneau des parameters.

Vous pouvez prendre l’idée plus loin et mettre à jour, par exemple, un compteur du nombre de fois que votre application a été lancée, ou d’autres informations intéressantes.

Basé sur la réponse de @ Quinn, voici le processus complet et le code de travail que j’utilise pour le faire.

  • Ajoutez un ensemble de parameters à votre application. Ne le renomme pas
  • Ouvrez Settings.bundle / Root.plist dans un éditeur de texte.

Remplacez le contenu par:

     PreferenceSpecifiers   Title About Type PSGroupSpecifier   DefaultValue DummyVersion Key version_preference Title Version Type PSTitleValueSpecifier   SsortingngsTable Root   
  • Créez une phase de génération Run Script , déplacez-la pour être après la phase Copy Bundle Resources . 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 comme index de votre entrée de version dans les parameters. L’exemple Root.plist ci-dessus l’a à l’index 1.

Utiliser le plist de Ben Clayton https://stackoverflow.com/a/12842530/338986

Ajouter Run script avec l’extrait suivant après les Copy Bundle Resources .

 version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionSsortingng" "$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" 

CFBundleVersion de CFBundleVersion en plus de CFBundleShortVersionSsortingng . Il émet une version comme celle-ci:

En écrivant à $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist au lieu de celui de $SRCROOT ayez quelques avantages.

  1. Il ne modifie pas les fichiers de la copie de travail du référentiel.
  2. Vous n’avez pas besoin de sélectionner le chemin d’access à Settings.bundle dans $SRCROOT . Le chemin peut varier.

Test sur Xcode 7.3.1

Basé sur l’exemple ici , voici le script que j’utilise pour mettre à jour automatiquement le numéro de version du bundle de parameters:

 #! /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:

     PreferenceSpecifiers   Title About Type PSGroupSpecifier   DefaultValue 1.0.0.0 Key version_preference Title Version Type PSTitleValueSpecifier   SsortingngsTable Root   

Les autres réponses ne fonctionnent pas correctement pour une seule raison: la phase de génération du script d’exécution n’est exécutée que si APRÈS le paquetage de parameters a été empaqueté. Donc, si votre version d’Info.plist est 2.0.11 et que vous la mettez à jour en 2.0.12, puis construisez / archivez votre projet, l’ensemble de parameters affichera toujours 2.0.11. Si vous ouvrez le paquetage Root.plist de parameters, 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 créer le projet AGAIN pour que le kit de parameters soit mis à jour correctement ou vous pouvez append le script à une phase de pré-génération à la place …

  • Dans XCode, modifiez le schéma de votre cible de projet
  • Cliquez sur la flèche de divulgation du schéma BUILD
  • Cliquez ensuite sur l’élément “Pré-actions”
  • Cliquez sur le signe plus et choisissez “Nouvelle action de script d’exécution”
  • Définissez la valeur du shell sur / bin / sh
  • Définissez “Fournir les parameters de construction de” à la cible de votre projet
  • Ajoutez votre script à la zone de texte. Le script suivant a fonctionné pour moi. Vous devrez peut-être modifier les chemins d’access pour correspondre à la configuration de votre projet:

    versionSsortingng = $ (/ usr / libexec / PlistBuddy -c “Imprimer CFBundleVersion” “$ {PROJECT_DIR} / $ {INFOPLIST_FILE}”)

    / usr / libexec / PlistBuddy “$ SRCROOT / Settings.bundle / Root.plist” -c “définit PreferenceSpecifiers: 0: DefaultValue $ versionSsortingng”

Cela exécutera correctement le script AVANT que le kit de parameters ne soit empaqueté pendant le processus de génération / archivage. Si vous ouvrez le fichier Root.plist du kit de parameters et créez / archivez votre projet, vous verrez que le numéro de version est mis à jour au début du processus de génération et que votre kit de parameters affichera la version correcte.

J’ai réussi à faire ce que je voulais en utilisant le projet open source pListcomstackr ( http://sourceforge.net/projects/plistcomstackr ).

  1. 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 "SsortingngsTable" value ssortingng "Root" key "PreferenceSpecifiers" value array [ dictionary { key "Type" value ssortingng "PSGroupSpecifier" key "Title" value ssortingng "AboutSection" } dictionary { key "Type" value ssortingng "PSTitleValueSpecifier" key "Title" value ssortingng "Version" key "Key" value ssortingng "version" key "DefaultValue" value ssortingng "VersionValue" key "Values" value array [ ssortingng "VersionValue" ] key "Titles" value array [ ssortingng "r" kRevisionNumber ] } ] } } 
  2. J’ai eu une phase de génération de script d’exécution personnalisée qui extrayait la révision de mon référentiel dans un fichier .h comme décrit par brad-larson ici .

  3. 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" 
  4. J’ai également ajouté une phase de génération de script personnalisée à ma cible xcode pour exécuter le compilateur à chaque fois que le projet est en cours de construction.

     /usr/local/plistcomstackr0.6/plcomstack -dest Settings.bundle -o Root.plist Settings.plc 

Et c’était ça!

Je pense que vous pouvez le faire en utilisant une méthode similaire à celle 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 le renommant $ {VERSIONVALUE}. Créez un fichier nommé versionvalue.xcconfig et ajoutez-le à votre projet. Accédez à la cible de votre application et accédez aux parameters de génération pour cette cible. Je pense que vous devez append 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ée sur sur “versionvalue”.

Enfin, accédez à votre cible et créez une phase de génération Run Script. Inspectez cette phase d’exécution du 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 permettre de remplacer la variable lorsque ces valeurs changent dans votre projet.