Frage

Ich möchte die Anwendungsversion und interne Revision, so etwas wie 1.0.1 (r1243) enthalten, in meiner Anwendung Einstellungen Bundle.

Die Root.plist-Datei enthält ein Fragment wie folgt ...

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

, und ich möchte die „Version“ string zur Buildzeit ersetzen.

ich ein Skript, das die Versionsnummer aus meinem Repository extrahieren kann, was ich brauche, ist ein Weg (pre-Prozess), um die Root.plist Datei zu Erstellungszeit zu verarbeiten, und ersetzen Sie die Revisionsnummer ohne die Quelldatei zu beeinflussen .

War es hilfreich?

Lösung 7

ich es geschafft, zu tun, was ich wollte die pListcompiler unter Verwendung von ( http://sourceforge.net/projects/plistcompiler ) Open-Source-porject.

  1. Mit diesen Compiler können Sie die Eigenschaftendatei in einer .plc Datei mit folgendem Format schreiben:

    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. hatte ich eine benutzerdefinierten Lauf Skript BUILD-Phase, die meine Repository-Revision wurde extrahierende Datei .h wie durch brad-larson hier .

  3. Die SPS-Datei kann Präprozessordirektiven enthalten, wie #define, #message, #if, #elif, # include, #WARNING, #ifdef, #else, Pragma, #error, #ifndef, #endif , Xcode Umgebungsvariablen. So konnte ich die Variable kRevisionNumber verweisen indem Sie die folgende Richtlinie

    #include "Revision.h"
    
  4. ich auch ein benutzerdefiniertes Skript BUILD-Phase zu meinem Xcode Ziel hinzugefügt den plcompiler jedes Mal das Projekt auszuführen wird gerade bauen

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

Und das war es!

Andere Tipps

Es gibt eine andere Lösung, die viel einfacher als eine der früheren Antworten sein kann. Apple bündelt ein Kommandozeilen-Tool namens PlistBuddy in den meisten seine Installateure, und hat es in Leopard auf /usr/libexec/PlistBuddy enthalten.

Da Sie VersionValue ersetzen wollen, vorausgesetzt, Sie den Versionswert in $newVersion extrahiert haben, können Sie diesen Befehl verwenden:

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

Keine Notwendigkeit, mit sed oder regulärer Ausdrücke Geige ist dieser Ansatz ganz einfach. Sehen Sie sich die Manpage für detaillierte Anweisungen. Sie können PlistBuddy verwenden, um hinzuzufügen, zu entfernen oder einen Eintrag in einer Eigenschaftsliste zu ändern. Zum Beispiel gebloggt ein Freund von mir über in Xcode Build-Nummern Inkrementieren mit PlistBuddy.

Hinweis: Wenn Sie nur den Pfad zum plist liefern, PlistBuddy in der interaktiven Modus, so dass Sie mehrere Befehle vor der Entscheidung ausgeben können, um Änderungen zu speichern. Ich auf jeden Fall empfehlen dies zu tun, bevor es in Ihrem Build-Skript Plopp.

Meine Lösung ist fauler Mann war die Versionsnummer von meinem Anwendungscode zu aktualisieren. Sie könnten eine Standard (oder leer) Wert im Root.plist haben und dann irgendwo in Ihrem Startcode:

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

Der einzige Haken ist, dass Ihre App werden, sobald hätte laufen zumindest für die aktualisierte Version im Einstellungsfenster angezeigt wird.

Man könnte die Idee nimmt weiter und zu aktualisieren, zum Beispiel ein Zähler, wie oft Ihre App oder andere interessante Bits von Informationen ins Leben gerufen wurde.

Basierend auf @ Quinns Antwort, hier die vollständige Prozess- und Arbeits Code, den ich diese verwenden zu tun.

  • einen Einstellungen-Bundle zu Ihren App hinzufügen. Sie nicht benennen Sie es.
  • Öffnen Settings.bundle / Root.plist in einem Texteditor

Ersetzen Sie den Inhalt mit:

<?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>
  • Erstellen Sie eine Skript ausführen bauen Phase bewegen sich nach dem Copy Bundle Ressourcen Phase. Fügen Sie diesen 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"
    
  • Ersetzen MyAppName mit Ihrem tatsächlichen App-Namen und die 1 nach PreferenceSpecifiers in den Einstellungen der Index Ihrer Version Eintrag. Das obige Root.plist Beispiel hat es bei Index 1.

Mit Ben Clayton plist https://stackoverflow.com/a/12842530/338986

In Run script mit folgendem Ausschnitt nach 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"

Anfügen CFBundleVersion zusätzlich von CFBundleShortVersionString. Es emittieren Version wie folgt:

Durch das Schreiben zu $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist statt der in $SRCROOT haben einige Vorteile.

  1. Es dosen't Dateien ändern Kopie Repository in Arbeit.
  2. Sie müssen nicht Pfad Fall in Settings.bundle $SRCROOT. Der Pfad kann variieren.

Test auf Xcode 7.3.1

Am Beispiel hier , hier ist das Skript I‘ verwende automatisch die Einstellungen Bündelversionsnummer aktualisiert werden:

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

Hier ist der Root.plist ich in Settings.bundle haben:

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

Die anderen Antworten funktionieren nicht richtig aus einem Grund: Der Run Script Build Phase wird bis nicht ausgeführt, nachdem die Einstellungen Bundle verpackt wurde. Also, wenn Ihre Info.plist Version 2.0.11 ist und Sie es auf 2.0.12 aktualisieren, dann bauen / archivieren Sie Ihr Projekt, wird das Einstellung-Bundle noch 2.0.11 sagen. Wenn Sie die Einstellungen bündeln Root.plist öffnen, können Sie sehen, dass die Versionsnummer nicht bis zum Ende des Build-Prozesses aktualisiert. Sie können das Projekt erstellen, um die Einstellungen Bündel korrekt aktualisiert zu erhalten, oder Sie können das Skript zu einer Pre-Build-Phase statt ...

hinzufügen
  • In XCode, Bearbeiten Sie das Schema für Ihr Projektziel
  • Klicken Sie auf die Offenlegung Pfeil auf dem BUILD-Schema
  • Klicken Sie dann auf die "Pre-Aktionen" Artikel
  • auf das Pluszeichen klicken und "New Run Script-Aktion"
  • wählen
  • Stellen Sie den Shell-Wert / bin / sh
  • Stellen Sie „Geben Sie Build-Einstellungen von“ zu einem Projekt Ziel
  • Fügen Sie Ihren Skript in den Textbereich. Das folgende Skript für mich gearbeitet. Sie können die Pfade ändern müssen, um Ihr Projekt-Setup anzupassen:

    Version = $ (/ usr / libexec / PlistBuddy -c "Drucken CFBundleVersion" "$ {project_dir} / $ {INFOPLIST_FILE}")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "gesetzt PreferenceSpecifiers: 0: Default $ Version"

Das wird richtig das Skript ausführen, bevor die Einstellungen Bündel während des Build / Archivierungsprozesses verpackt ist. Wenn Sie die Einstellungen bündeln Root.plist öffnen und bauen / archivieren Sie Ihr Projekt, sehen Sie nun die Versionsnummer wird zu Beginn des Build-Prozesses aktualisiert und Ihre Einstellungen Bundle wird die richtige Version angezeigt werden.

Ich glaube, Sie können dies tun, eine Art und Weise verwenden, der ähnlich ist, was ich in diese Antwort (basierend auf diesen Beitrag ).

Erstens können Sie Version eine Variable innerhalb Xcode machen, indem es $ {} Version umbenennen. Erstellen Sie eine Datei mit dem Namen versionvalue.xcconfig und fügen Sie es zu einem Projekt. Gehen Sie zu Ihrem Anwendungsziel und geht auf die Build-Einstellungen für dieses Ziel. Ich glaube, dass Sie Version als benutzerdefinierte Build-Einstellung hinzufügen müssen. In der unteren rechten Ecke des Fensters, der auf Wert Basierend ändern „Version“.

Schließlich gehen Sie zu Ihrem Ziel und erstellen Sie ein Skript ausführen Phase bauen. Überprüfen Sie, dass Run Script Phase und fügen Sie in Ihrem Skript im Script Textfeld ein. Zum Beispiel meines Skript meines BUILD_NUMBER Einstellung mit der aktuellen Subversion Build zu markieren, ist wie folgt:

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

Dies sollte den Trick zu ersetzen, die Variable tun, wenn diese Werte innerhalb des Projektes ändern.

Meine Arbeits Beispiel basiert auf @ Ben Clayton Antwort und die Kommentare von @Luis Ascorbe und @Vahid Amiri:

  

Hinweis: Dieser Ansatz ändert die Settings.bundle / Root.plist Datei in Kopie Repository arbeiten

  1. einen Einstellungen-Bundle zu einem Projekt root hinzufügen. Verwenden Sie es nicht umbenennen
  2. Öffnen Settings.bundle / Root.plist als Sourcecode

    Ersetzen Sie den Inhalt mit:

    <?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. Fügen Sie das folgende Skript zum Erstellen, Pre-Aktionen Abschnitt des Projektes (Ziel) Schemas

    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. Erstellen und Ausführen des aktuellen Schema

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top