Come posso visualizzare la versione dell'applicazione di revisione nelle impostazioni fascio di mia applicazione?

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

Domanda

Vorrei includere la versione dell'applicazione e la revisione interna, qualcosa di simile a 1.0.1 (r1243), nelle impostazioni fascio di mia applicazione.

Il file Root.plist contiene un frammento del genere ...

     <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, cosa ho bisogno è un modo per elaborare (pre-processo) il file Root.plist, al momento della compilazione, e sostituire il numero di revisione senza alterare il file sorgente .

È stato utile?

Soluzione 7

Sono riuscito a fare quello che volevo, utilizzando l'pListcompiler ( http://sourceforge.net/projects/plistcompiler ) open source porject.

  1. Con questo compilatore è possibile scrivere il file di 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. Ho avuto una fase di costruzione script eseguito personalizzato che stava estraendo la mia revisione repository per .h file 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 , le variabili di ambiente Xcode. Così mi è stato in grado di fare riferimento alla kRevisionNumber variabile aggiungendo la seguente direttiva

    #include "Revision.h"
    
  4. Ho anche aggiunto una fase di costruzione script personalizzato per il mio obiettivo Xcode per eseguire il plcompiler ogni volta che il progetto e stat costruire

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

E che era!

Altri suggerimenti

C'è un'altra soluzione che può essere molto più semplice di una delle due risposte precedenti. Apple ha fasci uno strumento da riga di comando chiamato PlistBuddy all'interno maggior parte dei suoi installatori, e lo ha incluso in Leopard a /usr/libexec/PlistBuddy.

Dal momento che si desidera sostituire VersionValue, a patto di avere il valore di versione estratto in $newVersion, è possibile utilizzare questo comando:

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

Non c'è bisogno di giocherellare con le espressioni regolari o sed, questo approccio è abbastanza semplice. Vedere la pagina per le istruzioni dettagliate. È possibile utilizzare PlistBuddy per aggiungere, rimuovere o modificare ogni iscrizione in un elenco di proprietà. Ad esempio, un mio amico ha bloggato su incrementare costruire numeri in Xcode utilizzando PlistBuddy.

Nota: se si fornisce solo il percorso del plist, PlistBuddy entra in modalità interattiva, in modo da poter eseguire più comandi prima di decidere di salvare le modifiche. Vi consiglio caldamente di fare questo prima di plopping nel vostro script di build.

La soluzione di mio uomo pigro è stato quello di aggiornare il numero di versione del mio codice dell'applicazione. Si potrebbe avere un valore predefinito (o vuoto) valore nel 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 vostra applicazione dovrebbe essere eseguito almeno una volta per la versione aggiornata di apparire nel pannello delle impostazioni.

Si potrebbe prendere ulteriormente l'idea e l'aggiornamento, per esempio, un contatore di quante volte la vostra applicazione è stata lanciata, o altre interessanti informazioni.

In base a @ risposta di Quinn, qui il processo completo e il codice di lavoro che uso per fare questo.

  • Aggiungi un fascio impostazioni per la vostra applicazione. Non rinominarla.
  • Apri Settings.bundle / Root.plist in un editor di testo

Sostituire 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>
  • Crea un Esegui script costruire fase, passare ad essere, dopo il Copia Bundle Risorse di fase. Aggiungere 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"
    
  • Sostituire MyAppName con il nome della tua applicazione effettiva, e il 1 dopo PreferenceSpecifiers essere l'indice della voce di versione nelle Impostazioni. L'esempio sopra Root.plist ha all'indice 1.

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

Aggiungi Run script con 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"

L'aggiunta CFBundleVersion in aggiunta di CFBundleShortVersionString. Si emettono versione in questo modo:

scrivendo a $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist al posto di quello in $SRCROOT avere alcuni benefici.

  1. E 'dose non modificare i file in copia del repository di lavoro.
  2. Non è necessario a caso percorso Settings.bundle in $SRCROOT. Il percorso può variare.

Test su Xcode 7.3.1

In base all'esempio qui , ecco la sceneggiatura ho' m utilizzando per aggiornare automaticamente le impostazioni del numero di versione del 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)

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>

Le altre risposte non funzionano correttamente per un motivo: La fase di compilazione di script corsa non viene eseguito fino a dopo il Bundle Impostazioni è stato confezionato. Quindi, se la vostra versione Info.plist è 2.0.11 e si aggiorna alla 2.0.12, quindi costruire / archiviare il progetto, il bundle Impostazioni sarà ancora dire 2.0.11. Se si apre le impostazioni del pacchetto Root.plist, si può vedere che il numero di versione non viene aggiornato fino alla fine del processo di generazione. È possibile costruire il progetto di nuovo per ottenere il fascio Impostazioni aggiornato correttamente, oppure è possibile aggiungere lo script a una fase di pre-compilazione invece ...

  • In XCode, modificare il regime per il vostro target del progetto
  • Fare clic sulla freccia informativa sul sistema di BUILD
  • Quindi, fare clic sulla voce "Pre-azioni"
  • Fare clic sul segno più e scegliere "Nuovo Esegui Action Script"
  • Imposta il valore di shell per / bin / sh
  • Imposta "Fornire impostazioni di generazione da" al tuo target del progetto
  • Aggiungi il tuo script per l'area di testo. Il seguente script ha funzionato per me. Potrebbe essere necessario modificare i percorsi in modo che corrisponda la configurazione del progetto:

    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"

Questo verrà eseguito correttamente lo script prima il fascio Impostazioni viene confezionato durante il processo di compilazione / archive. Se si apre le impostazioni del pacchetto Root.plist e costruire / archiviare il progetto, ora vedrete il numero di versione è aggiornata all'inizio del processo di generazione e il vostro pacco Impostazioni visualizzerà la versione corretta.

Io credo che si può fare questo usando un modo che è simile a quello che ho descritto nel questa risposta (basata su questo post ).

In primo luogo, si può fare VersionValue una variabile all'interno di Xcode rinominandolo a $ {} VERSIONVALUE. Creare un file denominato versionvalue.xcconfig e aggiungerlo al progetto. Vai al tuo bersaglio applicazione e andare alle impostazioni di generazione per quella destinazione. Io credo che è necessario aggiungere VERSIONVALUE come impostazione accumulo definita dall'utente. Nella-destra in basso di quella finestra, modificare il in base al valore di "versionvalue".

Infine, vai al tuo target e creare uno script Esegui fase di costruzione. Controllare che la fase Esegui script e incollare nel vostro script all'interno del campo di testo Script. Per esempio, il mio script per contrassegnare la mia impostazione con l'attuale generazione di Subversion BUILD_NUMBER è la 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 progetto.

Il mio esempio lavorando sulla base di @ Ben Clayton risposte e i commenti di @Luis Ascorbe e @Vahid Amiri:

  

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

  1. Aggiungi un fascio impostazioni per il vostro principale del progetto. Non rinominarlo
  2. Apri Settings.bundle / Root.plist come SourceCode

    Sostituire 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 per la compilazione, la sezione Pre-azioni dello schema di 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. compilare ed eseguire il regime attuale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top