Comment puis-je afficher la révision de la version de l'application dans le paquet de paramètres de mon application?

StackOverflow https://stackoverflow.com/questions/877128

Question

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 permet d'extraire le numéro de version de mon dépôt, ce que j'ai besoin est un moyen de traiter (prétraitement) le fichier Root.plist, au moment de la construction, et remplacer le numéro de révision sans affecter le fichier source .

Était-ce utile?

La solution 7

J'ai réussi à faire ce que je voulais en utilisant le pListcompiler ( http://sourceforge.net/projects/plistcompiler ) porject open source.

  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 "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
                    ]
                }
            ]
        }
    }
    
  2. J'ai eu une phase de construction de script exécuté personnalisé qui extrayait ma révision du référentiel de .h fichier tel que décrit par brad-larson ici .

  3. Le fichier plc peut contenir des directives de préprocesseur, comme #define, #message, #if, #elif, #include, #WARNING, #ifdef, #else, #pragma, #error, #ifndef, #endif , variables d'environnement Xcode. Donc, j'ai pu faire référence à la kRevisionNumber variables en ajoutant la directive suivante

    #include "Revision.h"
    
  4. J'ai aussi ajouté une phase de construction de script personnalisé à mon objectif de Xcode pour exécuter le plcompiler chaque fois que le projet est beeing construire

    /usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
    

Et ce fut tout!

Autres conseils

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

Puisque vous voulez remplacer VersionValue, supposant que vous avez la valeur 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 régulières ou sed, cette approche est assez simple. Voir la page pour obtenir des instructions détaillées. Vous pouvez utiliser PlistBuddy pour ajouter, supprimer ou modifier une entrée dans une liste de propriétés. Par exemple, un de mes amis blogué sur incrémenter numéros de build dans Xcode en utilisant PlistBuddy.

Remarque: Si vous fournissez juste le chemin vers le plist, PlistBuddy passe en mode interactif, de sorte que vous pouvez émettre plusieurs commandes avant de décider d'enregistrer les modifications. Je recommande vraiment le faire avant flac dans votre script de compilation.

Ma solution de l'homme paresseux était de mettre à jour le numéro de version de mon code d'application. Vous pourriez avoir une valeur par défaut (ou blanc) 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 hic est que votre application devrait être exécuté au moins une fois pour la version mise à jour apparaisse dans le panneau de configuration.

Vous pouvez prendre l'idée et la mise à jour, par exemple, un compteur de combien de fois votre application a été lancée, ou d'autres éléments intéressants d'information.

Basé sur @ réponse de Quinn, ici tout le processus et le code de travail que j'utilise pour le faire.

  • Ajouter un paquet de paramètres à votre application. Ne pas le renommer.
  • Ouvrir Settings.bundle / Root.plist dans un éditeur de texte

Remplacez le contenu avec:

<?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éer un Exécuter le script construction de la phase, passer à être après la Copier des ressources Bundle phase. 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"
    
  • Remplacer MyAppName avec le nom de votre application réelle, et 1 après PreferenceSpecifiers être l'index de votre entrée de version dans les paramètres. L'exemple de Root.plist ci-dessus présente au moment de l'index 1.

Utilisation plist https://stackoverflow.com/a/12842530/338986

Ajoutez Run script suivant avec extrait après Copy 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"

CFBundleVersion en plus Adjonction de CFBundleShortVersionString. Il émet la version comme ceci:

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

  1. Il ne marche pas modifier les fichiers dans la copie de travail du référentiel.
  2. Vous n'avez pas besoin au cas chemin de Settings.bundle dans $SRCROOT. Le chemin peut varier.

Test sur Xcode 7.3.1

Sur la base de l'exemple , voici le script que je » m à l'aide de mettre à jour automatiquement les paramètres numéro de version bundle:

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

Les autres réponses ne fonctionnent pas correctement pour une raison: La phase de construction du script d'exécution ne sera exécuté que une fois l'ensemble des paramètres a été emballé. Donc, si votre version Info.plist est 2.0.11 et vous mettre à jour à 2.0.12, puis construire / archiver votre projet, le faisceau de paramètres dira encore 2.0.11. Si vous ouvrez le paquet Paramètres Root.plist, vous pouvez voir que le numéro de version ne soit pas mis à jour jusqu'à la fin du processus de construction. Vous pouvez construire à nouveau le projet pour obtenir le paquet de paramètres mis à jour correctement, ou vous pouvez ajouter le script à une phase de pré-construction à la place ...

  • Dans XCode, Modifier le modèle pour votre projet cible
  • Cliquez sur la flèche d'information sur le système BUILD
  • Ensuite, cliquez sur la rubrique "Pré-actions"
  • Cliquez sur le signe plus et choisissez "Nouveau Run Action Script"
  • Définissez la valeur shell / bin / sh
  • Set « Fournir des paramètres de construction de » à votre cible de projet
  • Ajoutez votre script à la zone de texte. Le script suivant a fonctionné pour moi. Vous devrez peut-être modifier les chemins pour correspondre à la configuration de votre projet:

    versionString = $ (/ usr / libexec / PlistBuddy de "Print CFBundleVersion" "$ {} PROJECT_DIR / $ {} INFOPLIST_FILE")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "set PreferenceSpecifiers: 0: DefaultValue $ versionString"

Cela fonctionner correctement le script avant le faisceau de paramètres est emballé lors de la construction / processus d'archivage. Si vous ouvrez le paquet Paramètres Root.plist et construire / archiver votre projet, vous verrez maintenant le numéro de version est mis à jour au début du processus de construction et de votre paquet de paramètres affiche la version correcte.

Je crois que vous pouvez le faire en utilisant une manière qui est similaire à ce que je décris dans cette réponse (basée sur ce message ).

D'abord, vous pouvez faire VersionValue une variable dans Xcode en le renommant $ {} VersionValue. Créez un fichier nommé versionvalue.xcconfig et l'ajouter à votre projet. Accédez à votre cible d'application et accédez aux paramètres de construction pour cette cible. Je crois que vous devez ajouter VersionValue comme paramètre de construction défini par l'utilisateur. Dans le coin inférieur droit coin de cette fenêtre, changer la fonction de la valeur à « VersionValue ».

Enfin, allez à votre cible et créer une exécution de script Phase de construction. Inspecter cette phase Exécuter le script et coller dans votre script dans le champ de texte Script. Par exemple, mon script pour marquer mon BUILD_NUMBER réglage avec la construction Subversion actuelle est la suivante:

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 faire l'affaire de remplacer la variable lorsque ces valeurs changent dans votre projet.

Mon exemple de travail basé sur la réponse @Ben Clayton et les commentaires de @Luis Ascorbe et @Vahid Amiri:

  

Note: Cette approche modifie le Settings.bundle / Root.plist dans la copie de travail du référentiel

  1. Ajouter un paquet de paramètres à la racine de votre projet. Ne pas renommer
  2. Ouvrir Settings.bundle / Root.plist comme SourceCode

    Remplacez le contenu avec:

    <?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>
    
  3. Ajoutez le script suivant à la construction, la section Pré-actions du système 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"
    
  4. Construire et exécuter le système actuel

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top