Come posso visualizzare la revisione della versione dell'applicazione nel bundle delle impostazioni della mia applicazione?


91

Vorrei includere la versione dell'applicazione e la revisione interna, qualcosa come 1.0.1 (r1243), nel pacchetto delle impostazioni della mia applicazione.

Il file Root.plist contiene un frammento come questo ...

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

e vorrei sostituire la stringa "VersionValue" in fase di compilazione.

Ho uno script in grado di estrarre il numero di versione dal mio repository, ciò di cui ho bisogno è un modo per elaborare (pre-elaborare) il file Root.plist, in fase di compilazione, e sostituire il numero di revisione senza influire sul file di origine.

Risposte:


69

C'è un'altra soluzione che può essere molto più semplice di una delle risposte precedenti. Apple include uno strumento da riga di comando chiamato PlistBuddy nella maggior parte dei suoi programmi di installazione e lo ha incluso in Leopard all'indirizzo /usr/libexec/PlistBuddy.

Dal momento che vuoi sostituire VersionValue, supponendo che tu abbia il valore della versione estratto $newVersion, puoi usare questo comando:

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

Non c'è bisogno di giocherellare con sed o espressioni regolari, questo approccio è abbastanza semplice. Vedere la pagina man per istruzioni dettagliate. È possibile utilizzare PlistBuddy per aggiungere, rimuovere o modificare qualsiasi voce in un elenco di proprietà. Ad esempio, un mio amico ha scritto sul blog di aumentare i numeri di build in Xcode utilizzando PlistBuddy.

Nota: se fornisci solo il percorso al plist, PlistBuddy entra in modalità interattiva, quindi puoi impartire più comandi prima di decidere di salvare le modifiche. Consiglio vivamente di farlo prima di inserirlo nel tuo script di build.


20
Mi ci vuole un po 'per capire il modo giusto per fare riferimento al numero di versione nel mio plist; nel mio caso si è rivelato essere / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newversion" - si spera che sia utile ad altre persone.
JosephH

Quinn Taylor, JosephH, grazie alle tue risposte, sono stato in grado di implementare automaticamente il numero di versione della mia app nel Settings.bundle. +1 per entrambi ;-)
Niko

7
Da una fase di creazione personalizzata "Esegui script", avevo bisogno di includere più percorso per Root.plist: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newVersion "
Chris Vasselli

2
Solo per completezza, ecco un altro approccio con PListBuddy che ha funzionato per me: xcodehelp.blogspot.com/2012/05/…
koen

il modo più corretto è/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala

66

La soluzione del mio pigro era aggiornare il numero di versione dal codice della mia applicazione. Potresti avere un valore predefinito (o vuoto) in Root.plist e poi, da qualche parte nel codice di avvio:

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

L'unico problema è che la tua app dovrebbe essere eseguita almeno una volta affinché la versione aggiornata appaia nel pannello delle impostazioni.

Potresti approfondire l'idea e aggiornare, ad esempio, un contatore di quante volte la tua app è stata lanciata o altre informazioni interessanti.


9
Funzionerà tranne se l'utente accede alle Impostazioni prima di avviare la tua app.
Moshe

9
@Moshe True, ma per gestirlo in modo elegante, puoi semplicemente specificare un valore predefinito all'interno del file .plist, forse qualcosa come "Not Yet Launched"
Carlos P

1
anche se la maggior parte degli sviluppatori probabilmente impostato CFBundleShortVersionStringe CFBundleVersionsullo stesso valore, CFBundleShortVersionStringè in realtà ciò che Apple vuole prendere in considerazione la vostra rilasciato la versione , che sarebbe quello che si mostra agli utenti. CFBundleVersionpotrebbe potenzialmente essere un numero di versione interno, che probabilmente non dovresti mostrare agli utenti (se è diverso).
Nate

3
Mi sto perdendo qualcosa? Questo è ESATTAMENTE quello che sto facendo, ma il valore non viene modificato. Ragazzi, non state utilizzando una proprietà Title, che credo sia di sola lettura?
Sansone

2
C'è anche un altro problema durante l'aggiornamento dell'applicazione. Il pacchetto di impostazioni visualizzerà ancora la vecchia versione di build fino a quando l'applicazione aggiornata non viene avviata almeno una volta.
Legoless

61

Sulla base della risposta di @ Quinn, qui il processo completo e il codice di lavoro che uso per farlo.

  • Aggiungi un pacchetto di impostazioni alla tua app. Non rinominarlo.
  • Apri Settings.bundle / Root.plist in un editor di testo

Sostituisci il contenuto con:

<?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>
  • Creare una fase di compilazione Esegui script , spostarsi dopo la fase Copia risorse bundle . Aggiungi questo codice:

    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"
    
  • Sostituisci MyAppName con il nome della tua app effettiva e 1 dopo PreferenceSpecifiers per essere l'indice della voce della tua versione nelle Impostazioni. L'esempio precedente Root.plist lo ha all'indice 1.


Penso che questo sia il modo migliore per andare
Tony

Ho provato questo e vedo il valore del titolo cambiare nel mio pacchetto di impostazioni. Il titolo viene visualizzato in InAppSettingsKit, ma il valore non cambia rispetto alla versione iniziale. Il titolo non viene mai visualizzato nell'app Impostazioni. Mi arrendo e
aprirò

Quando si utilizza questo metodo, l'impostazione non è di sola lettura. cioè posso toccare l'impostazione del numero di versione in settings.app ed è modificabile.
motionpotion

8
Lo script bash @ ben-clayton messo non ha funzionato per me, quindi l'ho rifatto in base alla sua risposta, eccolo: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
puoi usare ${INFOPLIST_PATH}per il percorso info plist
Tomer Even

23

Utilizzando il plist di Ben Clayton https://stackoverflow.com/a/12842530/338986

Aggiungi Run scriptcon il seguente frammento dopo 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"

Aggiunta CFBundleVersionin aggiunta di CFBundleShortVersionString. Emette una versione come questa:

Scrivendo a $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist invece che a quello in si $SRCROOThanno alcuni vantaggi.

  1. Non modifica i file nella copia funzionante del repository.
  2. Non è necessario inserire il percorso del caso Settings.bundlein $SRCROOT. Il percorso può variare.

Test su Xcode 7.3.1


1
Questa è la migliore risposta IMO se aggiungi lo script alla sezione Build, Pre-action dello schema del progetto. Guarda la risposta di Andy.
Vahid Amiri

2
Questo sta funzionando per me. Ricorda solo di modificare "DefaultValue" in modo che sia specifico per te. Ad esempio, volevo modificare il piè di pagina, quindi ho usato "FooterText". È inoltre necessario modificare il numero dopo "PreferenceSpecifiers" in modo che sia correlato all'elemento nel plist.
Richard Witherspoon il

12

Sulla base dell'esempio qui , ecco lo script che sto utilizzando per aggiornare automaticamente il numero di versione del bundle di impostazioni:

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

Ecco il Root.plist che ho in 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>

Molto utile - Ho problemi a eseguire PlistBuddy da Python, e non avrei mai pensato di usarlo NSDictionary(e non mi ero nemmeno reso conto che ti dava un accesso così facile ai file plist)
Dov

Grazie per questo. Una modifica - come l'hai ora, apporta una modifica alla fonte, non alla builddir - il che significa che ciò che vedi sul tuo dispositivo o nel simulatore sarà sempre una versione di build dietro la versione di build effettiva. Per risolvere questo problema, ho modificato il tuo script per iterare prima sui sorgenti, poi anche su builddir, ad es. settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod

... e inoltre, aggiungo il githash:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod

8

Le altre risposte non funzionano correttamente per un motivo: la fase di creazione dello script di esecuzione non viene eseguita fino a DOPO che il pacchetto di impostazioni è stato impacchettato. Quindi, se la tua versione di Info.plist è 2.0.11 e la aggiorni alla 2.0.12, quindi compila / archivia il tuo progetto, il bundle delle impostazioni continuerà a dire 2.0.11. Se apri il bundle delle impostazioni Root.plist, puoi vedere che il numero di versione non viene aggiornato fino alla FINE del processo di compilazione. Puoi costruire ANCORA il progetto per aggiornare correttamente il bundle delle impostazioni oppure puoi aggiungere lo script a una fase di pre-compilazione ...

  • In XCode, modifica lo schema per la destinazione del tuo progetto
  • Fare clic sulla freccia di divulgazione nello schema BUILD
  • Quindi, fai clic sulla voce "Pre-azioni"
  • Fai clic sul segno più e scegli "Nuova azione Esegui script"
  • Imposta il valore della shell su / bin / sh
  • Imposta "Fornisci impostazioni di compilazione da" alla destinazione del progetto
  • Aggiungi il tuo script all'area di testo. Il seguente script ha funzionato per me. Potrebbe essere necessario modificare i percorsi in modo che corrispondano alla configurazione del progetto:

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

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

Questo eseguirà correttamente lo script PRIMA che il bundle delle impostazioni venga impacchettato durante il processo di creazione / archiviazione. Se apri il pacchetto di impostazioni Root.plist e crei / archivi il tuo progetto, ora vedrai che il numero di versione è aggiornato all'inizio del processo di compilazione e il tuo pacchetto di impostazioni visualizzerà la versione corretta.


Grazie, solo la tua soluzione mostra la versione build corretta. Altre soluzioni necessarie per costruire due volte.
Boris Y.

Ciò richiedeva ancora una seconda build per me, utilizzando Xcode 10.0
Patrick

@Patrick L'app delle impostazioni iOS a volte conserva le vecchie informazioni. Per vedere la modifica, devi uccidere e riavviare l'app Impostazioni.
Andy

1
A proposito, ho trovato un modo più semplice per aggiungere questo script: vai alla scheda Build Phases della destinazione del tuo progetto e fai clic sull'icona "+". Scegli "Nuova fase di esecuzione dello script" e aggiungi il codice dello script. QUESTA È LA CHIAVE: fare clic e trascinare il nuovo script di esecuzione in cima all'elenco Build Phases, sotto Target Dependencies, ma prima di Compile Sources. Si comporterà come uno script di pre-compilazione ed è più facile da trovare.
Andy

Grazie @ Anddy, la tua soluzione per l'aggiunta alla scheda Fasi di costruzione ha funzionato perfettamente.
Patrick

7

Con Xcode 11.4, puoi utilizzare i seguenti passaggi per visualizzare la versione dell'app nel bundle delle impostazioni dell'applicazione.


Insieme $(MARKETING_VERSION)e $(CURRENT_PROJECT_VERSION)variabili

Nota: se vengono visualizzate variabili $(MARKETING_VERSION)e $(CURRENT_PROJECT_VERSION)per i tasti Bundle version string (short)e Bundle versionin Info.plist , è possibile saltare i passaggi seguenti e passare alla sezione successiva.

  1. Apri il progetto Xcode.
  2. Apri Project Navigator ( cmd1), seleziona il tuo progetto per rivelare le impostazioni del progetto, quindi seleziona la destinazione dell'app.
  3. Seleziona la scheda Generale .
  4. Nella sezione Identità , modifica il contenuto del campo Versione con un nuovo valore (ad esempio 0.1.0) e modifica il contenuto del campo Crea con un nuovo valore (ad esempio 12). Queste 2 modifiche creeranno $(MARKETING_VERSION)e $(CURRENT_PROJECT_VERSION)variabili nel file Info.plist .

Crea e configura il pacchetto di impostazioni

  1. Nel Navigatore progetto , seleziona il tuo progetto.
  2. Seleziona File > Nuovo > File ... ( cmdN).
  3. Seleziona la scheda iOS .
  4. Seleziona Pacchetto di impostazioni nella sezione Risorsa , quindi fai clic su Avanti e Crea .
  5. Seleziona Root.plist e aprilo come codice sorgente. Sostituisci il suo contenuto con il codice seguente:
<?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>

Aggiungi uno script di esecuzione

  1. Nel Navigatore progetto , seleziona il tuo progetto.
  2. Seleziona la destinazione dell'app.
  3. Seleziona la scheda Build Phases .
  4. Fare clic su + > Nuova fase di esecuzione dello script .
  5. Trascina e rilascia la nuova fase da qualche parte sopra la sezione Copia risorse pacchetto . In questo modo, lo script verrà eseguito prima di compilare l'applicazione.
  6. Aprire la fase Esegui script appena aggiunta e aggiungere il seguente script:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

Avvia l'app

  1. Esegui il prodotto ( cmdR) sul dispositivo o sul simulatore.
  2. Sul dispositivo o sul simulatore, una volta avviata l'app, apri l' app Impostazioni e seleziona la tua app nell'elenco delle app di terze parti. La versione dell'app dovrebbe essere visualizzata come mostrato di seguito:


Fonti


Questo genera un errore per meSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H

2
Questo ha funzionato per me:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H

Grazie. Questo è il mondo per me. Ma il mio si chiamava Settings-Watch.bundle e ha rimosso($build)
Kurt Lane il

3

Sono riuscito a fare quello che volevo utilizzando il progetto open source pListcompiler ( http://sourceforge.net/projects/plistcompiler ).

  1. Utilizzando questo compilatore è possibile scrivere il file delle proprietà in un file .plc utilizzando il seguente formato:

    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. Avevo una fase di creazione dello script di esecuzione personalizzata che estraeva la revisione del mio repository nel file .h come descritto da brad-larson qui .

  3. Il file plc può contenere direttive del preprocessore, come #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, xcode. Quindi sono stato in grado di fare riferimento alla variabile kRevisionNumber aggiungendo la seguente direttiva

    #include "Revision.h"
    
  4. Ho anche aggiunto una fase di creazione dello script personalizzato al mio target xcode per eseguire il plcompiler ogni volta che il progetto viene compilato

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

E questo era tutto!


Sembra un sacco di lavoro solo per sostituire un singolo valore in un file plist ... Concettualmente è interessante poter accedere a una variabile durante la creazione di un plist, ma è molto più facile usare una build di strumenti per file plist. Descrivo PlistBuddy nella mia risposta: provaci!
Quinn Taylor il

3

Il mio esempio di lavoro basato sulla risposta di @Ben Clayton e sui commenti di @Luis Ascorbe e @Vahid Amiri:

Nota: questo approccio modifica il file Settings.bundle / Root.plist nella copia di lavoro del repository

  1. Aggiungi un pacchetto di impostazioni alla radice del progetto. Non rinominarlo

  2. Apri Settings.bundle / Root.plist come SourceCode

    Sostituisci il contenuto con:

    <?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. Aggiungere il seguente script alla sezione Build, Pre-action dello schema del progetto (target)

    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. Crea ed esegui lo schema corrente


2

Le risposte sopra non hanno funzionato per me, quindi ho creato il mio script personalizzato.

Questo aggiorna dinamicamente la voce da Root.plist

Usa lo script di esecuzione di seguito. Funzionerà sicuramente verificato in xcode 10.3.

"var buildVersion" è la versione da visualizzare nel titolo.

E il nome dell'identificatore è "var version" sotto per il titolo in 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

Voce di esempio in 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>

Voce Root.plist di esempio funzionante


1

Credo che tu possa farlo usando un modo simile a quello che descrivo in questa risposta (basato su questo post ).

Innanzitutto, puoi rendere VersionValue una variabile all'interno di Xcode rinominandola in $ {VERSIONVALUE}. Crea un file denominato versionvalue.xcconfig e aggiungilo al tuo progetto. Vai alla destinazione dell'applicazione e vai alle impostazioni di compilazione per quella destinazione. Credo che sia necessario aggiungere VERSIONVALUE come impostazione di build definita dall'utente. Nell'angolo inferiore destro di quella finestra, modifica il valore Basato su "valore di versione".

Infine, vai al tuo target e crea una fase di build Run Script. Controlla la fase Esegui script e incolla il tuo script nel campo di testo Script. Ad esempio, il mio script per taggare la mia impostazione BUILD_NUMBER con l'attuale build di Subversion è il seguente:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

Questo dovrebbe fare il trucco di sostituire la variabile quando questi valori cambiano all'interno del tuo progetto.


Funziona se voglio incorporare il numero di versione nel file Info.plist. Ma non riesco a farlo funzionare per altri file plist, ad esempio il file Root.plist che si trova in Settings.bundle. C'è un'impostazione di build che posso usare per abilitarlo?
Panagiotis Korros

0

Per me questa è stata la soluzione più semplice:

Aggiungere una nuova fase di creazione dello script prima del passaggio Copia risorse bundle

Conchiglia: /usr/bin/env python

Soddisfare:

#! /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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.