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

91

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.

Panagiotis Korros
la source

Réponses:

69

Il existe une autre solution qui peut être beaucoup plus simple que l'une ou l'autre 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' adresse/usr/libexec/PlistBuddy .

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

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

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

Remarque: Si vous fournissez uniquement le chemin d'accès au plist, PlistBuddy passe en mode interactif, vous pouvez donc émettre plusieurs commandes avant de décider d'enregistrer les modifications. Je recommande vivement de le faire avant de le placer dans votre script de construction.

Quinn Taylor
la source
20
Il me semble un certain temps de trouver la bonne façon de faire référence au numéro de version dans mon plist; dans mon cas, il s'est avéré être / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newversion" - j'espère que cela sera utile à d'autres personnes.
JosephH
Quinn Taylor, JosephH, grâce à vos réponses, j'ai pu implémenter automatiquement le numéro de version de mes applications dans le Settings.bundle. +1 pour vous deux ;-)
Niko
7
À partir d'une phase de construction "Run Script" personnalisée, j'avais besoin d'inclure davantage du chemin vers Root.plist: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newVersion "
Chris Vasselli
2
Juste pour être complet, voici une autre approche de PListBuddy qui a fonctionné pour moi: xcodehelp.blogspot.com/2012/05
koen
la manière la plus correcte est/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala
66

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
9
Cela fonctionnera sauf si l'utilisateur accède aux paramètres avant de lancer votre application.
Moshe
9
@Moshe True, mais pour gérer cela avec élégance, vous pouvez simplement spécifier une valeur par défaut dans le fichier .plist, peut-être quelque chose comme `` Pas encore lancé ''
Carlos P
1
bien que la plupart des développeurs définissent probablement CFBundleShortVersionStringet CFBundleVersionà la même valeur, CFBundleShortVersionStringc'est en fait ce qu'Apple veut que vous considériez comme votre version publiée , ce que vous montrez aux utilisateurs. CFBundleVersionpourrait potentiellement être un numéro de version interne, que vous ne devriez probablement pas montrer aux utilisateurs (s'il diffère).
Nate
3
Est-ce que je manque quelque chose? C'est exactement ce que je fais, mais la valeur ne change pas. N'utilisez-vous pas une propriété Title, qui, je crois, est en lecture seule?
samson
2
Il existe également un autre problème lors de la mise à jour de l'application. L'ensemble de paramètres afficherait toujours l'ancienne version de build jusqu'à ce que l'application mise à jour soit lancée au moins une fois.
Legoless
61

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

  • Ajoutez un ensemble de paramètres à votre application. Ne le renommez pas.
  • Ouvrez Settings.bundle / Root.plist dans un éditeur de texte

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.

Ben Clayton
la source
Je pense que c'est la meilleure façon de procéder
Tony
J'ai essayé cela et je vois la valeur du titre changer dans mon ensemble de paramètres. Le titre apparaît dans InAppSettingsKit, mais la valeur ne change pas par rapport à la version initiale. Le titre n'apparaît jamais dans l'application Paramètres.
J'abandonne
Lorsque vous utilisez cette méthode, le paramètre n'est pas en lecture seule. c'est-à-dire que je peux accéder au paramètre de numéro de version dans le settings.app et il est modifiable.
motionpotion
8
Le script bash @ ben-clayton mis n'a pas fonctionné pour moi, alors je le refais en fonction de sa réponse, la voici: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"
Luis Ascorbe
1
vous pouvez utiliser ${INFOPLIST_PATH}pour le chemin info plist
Tomer Even
23

Utilisation du plist de Ben Clayton https://stackoverflow.com/a/12842530/338986

Ajouter Run scriptavec l'extrait suivant 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"

Ajout CFBundleVersionen plus de CFBundleShortVersionString. Il émet une version comme celle-ci:

En écrivant à $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist au lieu de celui en, vous $SRCROOTavez certains avantages.

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

Test sur Xcode 7.3.1

Hiroshi
la source
1
C'est la meilleure réponse IMO si vous ajoutez le script à la section Construction, Pré-actions du schéma de projet. Regardez la réponse d'Andy.
Vahid Amiri
2
Cela fonctionne pour moi. N'oubliez pas de changer "DefaultValue" pour qu'il soit spécifique à vous. Par exemple, je voulais changer le pied de page donc j'ai utilisé "FooterText". Vous devez également modifier le nombre après "PreferenceSpecifiers" afin qu'il corresponde à l'élément dans le plist.
Richard Witherspoon
12

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>
Mrwalker
la source
Très utile - j'ai du mal à exécuter PlistBuddy à partir de Python, et je n'aurais jamais pensé à utiliser NSDictionary( et je ne savais pas que cela vous donnait un accès aussi facile aux fichiers plist, non plus)
Dov
Merci pour ça. Une modification - comme vous l'avez maintenant, elle modifie la source, pas le builddir - ce qui signifie que ce que vous voyez sur votre appareil ou dans le simulateur sera toujours une version de build derrière la version de build réelle. Pour résoudre ce problème, j'ai modifié votre script pour itérer d'abord sur la source, puis également sur le builddir, ie. settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod
... et aussi, j'ajoute le githash:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod
8

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 ...

  • Dans XCode, modifiez le schéma de la cible de votre projet
  • Cliquez sur la flèche de divulgation sur le schéma BUILD
  • Ensuite, cliquez 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 paramètres de construction de" sur 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 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.

Andy
la source
Merci, seule votre solution affiche la version de build correcte. Autres solutions nécessaires pour construire deux fois.
Boris Y.20
Cela nécessitait encore une deuxième version pour moi, en utilisant Xcode 10.0
Patrick
@Patrick L'application des paramètres iOS conserve parfois d'anciennes informations. Pour voir le changement, vous devez tuer et redémarrer l'application Paramètres.
Andy
1
BTW, j'ai trouvé un moyen plus simple d'ajouter ce script: allez dans l'onglet Build Phases de la cible de votre projet et cliquez sur l'icône "+". Choisissez "New Run Script Phase" et ajoutez le code de script là-dedans. CECI EST LA CLÉ: cliquez et faites glisser le nouveau script d'exécution en haut de la liste des phases de construction, sous Dépendances cibles, mais avant les sources de compilation. Cela se comportera de la même manière qu'un script de pré-construction et est plus facile à trouver.
Andy
Merci @Andy, votre solution d'ajout à l'onglet Build Phases a parfaitement fonctionné.
Patrick
7

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)variables

Remarque: si des variables $(MARKETING_VERSION)et $(CURRENT_PROJECT_VERSION)apparaissent pour les clés Bundle version string (short)et Bundle versiondans Info.plist , vous pouvez ignorer les étapes suivantes et passer à la section suivante.

  1. Ouvrez le projet Xcode.
  2. Ouvrez Project Navigator ( cmd1), sélectionnez votre projet pour afficher les paramètres de votre projet, puis sélectionnez la cible de l'application.
  3. Sélectionnez l' onglet Général .
  4. Dans la section Identité , changez le contenu du champ Version en une nouvelle valeur (par exemple 0.1.0) et changez le contenu du champ Construire en une nouvelle valeur (par exemple 12). 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

  1. Dans le navigateur de projet , sélectionnez votre projet.
  2. Sélectionnez Fichier > Nouveau > Fichier… ( cmdN).
  3. Sélectionnez l' onglet iOS .
  4. Sélectionnez Ensemble de paramètres dans la section Ressource , puis cliquez sur Suivant et Créer .
  5. Sélectionnez Root.plist et ouvrez-le en tant que code source. Remplacez son contenu par le code ci-dessous:
<?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

  1. Dans le navigateur de projet , sélectionnez votre projet.
  2. Sélectionnez la cible de l'application.
  3. Sélectionnez l' onglet Phases de construction .
  4. Cliquez sur + > Nouvelle phase d'exécution du script .
  5. Faites glisser et déposez la nouvelle phase quelque part au-dessus de la section Copier les ressources de l'ensemble . De cette manière, le script sera exécuté avant la compilation de l'application.
  6. Ouvrez la phase d' exécution du script nouvellement ajoutée et ajoutez le script suivant:
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

  1. Exécutez le produit ( cmdR) sur l'appareil ou le simulateur.
  2. Sur l'appareil ou le simulateur, une fois l'application lancée, ouvrez l' application Paramètres et sélectionnez votre application dans la liste des applications tierces. La version de l'application doit être affichée comme indiqué ci-dessous:


Sources

Imanou Petit
la source
Cela jette une erreur pour moiSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H
2
Cela a fonctionné pour moi:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H
Merci. C'est quel monde pour moi. Mais le mien s'appelait Settings-Watch.bundle et supprimait le($build)
Kurt Lane le
3

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

  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 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 .

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

Panagiotis Korros
la source
Cela ressemble à beaucoup de travail juste pour remplacer une seule valeur dans un fichier plist ... C'est conceptuellement cool de pouvoir accéder à une variable lors de la construction d'un plist, mais beaucoup plus facile d'utiliser un outil de construction pour un fichier plist. Je décris PlistBuddy dans ma réponse - essayez-le!
Quinn Taylor
3

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

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

  1. Ajoutez un ensemble de paramètres à la racine de votre projet. Ne le renommez pas

  2. 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>
    
  3. 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"
    
  4. Construire et exécuter le schéma actuel

Peter Kreinz
la source
2

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>

Échantillon de travail d'entrée Root.plist

dheeraj_jha
la source
1

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.

Brad Larson
la source
Cela fonctionne si je souhaite intégrer le numéro de version dans le fichier Info.plist. Mais je ne peux pas le faire fonctionner pour d'autres fichiers plist, par exemple le fichier Root.plist qui se trouve dans le Settings.bundle. Existe-t-il un paramètre de construction que je peux utiliser pour l'activer?
Panagiotis Korros
0

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)
gklka
la source