93 votes

Comment puis-je afficher la version de l'application de la révision dans mes paramètres de l'application bundle?

Je voudrais inclure la version de l'application et de la révision interne, quelque chose comme la version 1.0.1 (r1243), dans mes paramètres de l'application bundle.

De La Racine.fichier plist contient un fragment comme ça...

     <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 le "VersionValue" chaîne de caractères au moment de la construction.

J'ai un script qui permet d'extraire le numéro de version de mon référentiel, ce que j'ai besoin d'une manière de processus (pré-processus) de la Racine.fichier plist, au moment de la construction, et de remplacer le numéro de révision sans affecter le fichier source.

71voto

Quinn Taylor Points 29688

Il y a une autre solution qui peut être beaucoup plus simple que les précédentes réponses. Apple paquets, un outil de ligne de commande appelé PlistBuddy à l'intérieur de la plupart de ses installateurs, et l'a intégré dans Leopard en /usr/libexec/PlistBuddy.

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

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

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

Remarque: Si vous fournissez simplement le chemin d'accès au fichier plist, PlistBuddy entre dans le mode interactif, de sorte que vous pouvez exécuter plusieurs commandes avant de décider d'enregistrer les modifications. Je vous recommande vraiment de le faire avant en s'écrasant dans votre script de construction.

64voto

Ben Clayton Points 16793

@Quinn réponse, ici, l'ensemble du processus de travail et de code que j'utilise pour ce faire.

  • Ajouter un à un les paramètres de bundle pour votre application. Ne pas le renommer.
  • Ouvrir Les Paramètres.bundle/Racine.plist dans un éditeur de texte

Remplacer 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 Script phase de construction, du coup après la Cible des Dépendances. Ajoutez ce code:

    version=\`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $SRCROOT/Classes/MyAppName-Info.plist\`
    
    /usr/libexec/PlistBuddy "$SRCROOT/Classes/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:1:DefaultValue $version"
    
  • Remplacer MyAppName avec vos réels le nom de l'application, et le 1 après PreferenceSpecifiers à l'index de votre Version d'entrée dans les Paramètres. Au-dessus de la Racine.plist exemple a à l'indice 1.

13voto

mrwalker Points 1118

S'appuyant sur l'exemple ici, voici le script que j'utilise pour mettre à jour automatiquement les paramètres de faisceau numéro de version:

#! /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 la Racine.plist j'ai dans les Paramètres.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>

3voto

Panagiotis Korros Points 3073

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

  1. L'utilisation de ce compilateur, vous pouvez écrire le fichier de propriétés dans une .plc de fichiers 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 coutume d'exécuter un script de build phase d'extraction de mon révision du dépôt .h fichier comme décrit par brad-larson ici.

  3. Le plc fichier peut contenir des directives de préprocesseur, comme les #define, #message #if, #elif, #include, #avertissement, #ifdef, #else, #pragma, d'erreur#, #ifndef, #endif, xcode, les variables d'environnement. J'ai donc été en mesure de référencer la variable kRevisionNumber en ajoutant la directive suivante

    #include "Revision.h"
    
  4. J'ai également ajouté un script personnalisé phase de construction de mon xcode cible 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 c'était tout!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X