Ich möchte die Anwendungsversion und die interne Revision, etwa 1.0.1 (r1243), in das Einstellungspaket meiner Anwendung aufnehmen.
Die Root.plist-Datei enthält ein Fragment wie dieses ...
<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 Zeichenfolge "VersionValue" beim Erstellen ersetzen.
Ich habe ein Skript, das die Versionsnummer aus meinem Repository extrahieren kann. Ich benötige eine Möglichkeit, die Root.plist-Datei zum Zeitpunkt der Erstellung zu verarbeiten (vorzuverarbeiten) und die Versionsnummer zu ersetzen, ohne die Quelldatei zu beeinflussen.
quelle
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
Die Lösung meines faulen Mannes bestand darin, die Versionsnummer aus meinem Anwendungscode zu aktualisieren. Sie könnten einen Standardwert (oder einen leeren Wert) in der Root.plist und dann irgendwo in Ihrem Startcode haben:
Der einzige Haken ist, dass Ihre App mindestens einmal ausgeführt werden muss, damit die aktualisierte Version im Einstellungsfeld angezeigt wird.
Sie können die Idee weiterentwickeln und beispielsweise einen Zähler dafür aktualisieren, wie oft Ihre App gestartet wurde, oder andere interessante Informationen.
quelle
CFBundleShortVersionString
undCFBundleVersion
den gleichen Wert,CFBundleShortVersionString
ist eigentlich das, was Apple will Sie prüfen , veröffentlicht Version , die wäre, was Sie für die Nutzer zeigen.CFBundleVersion
Möglicherweise handelt es sich um eine interne Versionsnummer, die Sie Benutzern wahrscheinlich nicht anzeigen sollten (sofern diese unterschiedlich ist).Basierend auf der Antwort von @ Quinn, hier der vollständige Prozess und Arbeitscode, den ich dazu verwende.
Ersetzen Sie den Inhalt durch:
Erstellen Sie eine Run Script- Erstellungsphase und verschieben Sie diese nach der Phase " Cople Bundle Resources" . Fügen Sie diesen Code hinzu:
Ersetzen Sie MyAppName durch den Namen Ihrer tatsächlichen App und die 1 nach PreferenceSpecifiers als Index für Ihren Versionseintrag in den Einstellungen. Das obige Root.plist-Beispiel hat es bei Index 1.
quelle
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"
${INFOPLIST_PATH}
für den Info-Plist-Pfad verwendenVerwenden der Plist von Ben Clayton https://stackoverflow.com/a/12842530/338986
Fügen Sie
Run script
mit folgendem Snippet nach hinzuCopy Bundle Resources
.Anhängen
CFBundleVersion
zusätzlich zuCFBundleShortVersionString
. Es gibt eine Version wie diese aus:Durch das Schreiben an
$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist
anstelle desjenigen in$SRCROOT
haben einige Vorteile.Settings.bundle
in$SRCROOT
. Der Pfad kann variieren.Testen mit Xcode 7.3.1
quelle
Anhand des Beispiels hier ist das Skript, mit dem ich die Versionsnummer des Einstellungspakets automatisch aktualisiere:
Hier ist die Root.plist, die ich in Settings.bundle habe:
quelle
NSDictionary
(und wusste auch nicht, dass es Ihnen einen so einfachen Zugriff auf Plist-Dateien ermöglicht)gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
Die anderen Antworten funktionieren aus einem Grund nicht richtig: Die Erstellungsphase des ausgeführten Skripts wird erst ausgeführt, nachdem das Einstellungspaket gepackt wurde. Wenn Ihre Info.plist-Version 2.0.11 ist und Sie sie auf 2.0.12 aktualisieren und dann Ihr Projekt erstellen / archivieren, wird im Einstellungspaket weiterhin 2.0.11 angezeigt. Wenn Sie das Einstellungspaket Root.plist öffnen, können Sie sehen, dass die Versionsnummer erst am Ende des Erstellungsprozesses aktualisiert wird. Sie können das Projekt WIEDER erstellen, um das Einstellungspaket korrekt zu aktualisieren, oder Sie können das Skript stattdessen einer Vorbereitungsphase hinzufügen ...
Fügen Sie Ihr Skript zum Textbereich hinzu. Das folgende Skript hat bei mir funktioniert. Möglicherweise müssen Sie die Pfade an Ihr Projekt-Setup anpassen:
versionString = $ (/ usr / libexec / PlistBuddy -c "CFBundleVersion drucken" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")
/ usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "setzt PreferenceSpecifiers: 0: DefaultValue $ versionString"
Dadurch wird das Skript korrekt ausgeführt, BEVOR das Einstellungspaket während des Erstellungs- / Archivierungsprozesses gepackt wird. Wenn Sie das Einstellungspaket Root.plist öffnen und Ihr Projekt erstellen / archivieren, wird jetzt die Versionsnummer zu Beginn des Erstellungsprozesses aktualisiert und in Ihrem Einstellungspaket wird die richtige Version angezeigt.
quelle
Mit Xcode 11.4 können Sie die folgenden Schritte ausführen, um die App-Version im Einstellungspaket Ihrer Anwendung anzuzeigen.
Menge
$(MARKETING_VERSION)
und$(CURRENT_PROJECT_VERSION)
VariablenHinweis: Wenn
$(MARKETING_VERSION)
und$(CURRENT_PROJECT_VERSION)
Variablen fürBundle version string (short)
undBundle version
Schlüssel in Info.plist angezeigt werden , können Sie die folgenden Schritte überspringen und zum nächsten Abschnitt springen.0.1.0
) und die Änderung des Aufbaus Inhaltsfeld zu einem gewissen neuen Wert (zB12
). Diese beiden Änderungen erstellen$(MARKETING_VERSION)
und$(CURRENT_PROJECT_VERSION)
Variablen in der Datei Info.plist .Erstellen und konfigurieren Sie das Einstellungspaket
Fügen Sie ein Ausführungsskript hinzu
App starten
Quellen
quelle
Set: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
($build)
Mit dem Open-Source-Projekt pListcompiler ( http://sourceforge.net/projects/plistcompiler ) konnte ich das tun, was ich wollte .
Mit diesem Compiler können Sie die Eigenschaftendatei in eine .plc-Datei im folgenden Format schreiben:
Ich hatte eine eigene Skript BUILD - Phase ausführen , die meine Repository - Revision zu .h - Datei wurde extra wie brad-Larson beschrieben hier .
Die plc-Datei kann Präprozessoranweisungen wie #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, xcode-Umgebungsvariablen enthalten. So konnte ich auf die Variable kRevisionNumber verweisen, indem ich die folgende Direktive hinzufügte
Ich habe meinem xcode-Ziel auch eine benutzerdefinierte Skript-Erstellungsphase hinzugefügt, um den plcompiler jedes Mal auszuführen, wenn das Projekt erstellt wird
Und das war es!
quelle
Mein Arbeitsbeispiel basiert auf der Antwort von @Ben Clayton und den Kommentaren von @Luis Ascorbe und @Vahid Amiri:
Fügen Sie Ihrem Projektstamm ein Einstellungspaket hinzu. Benennen Sie es nicht um
Öffnen Sie Settings.bundle / Root.plist als SourceCode
Ersetzen Sie den Inhalt durch:
Fügen Sie dem Abschnitt Erstellen, Voraktionen des Projektschemas (Zielschemas) das folgende Skript hinzu
Erstellen Sie das aktuelle Schema und führen Sie es aus
quelle
Die obigen Antworten haben bei mir nicht funktioniert, daher habe ich mein benutzerdefiniertes Skript erstellt.
Dadurch wird der Eintrag aus Root.plist dynamisch aktualisiert
Verwenden Sie unten das Ausführungsskript. Wir werden sicher in xcode 10.3 verifiziert arbeiten.
"var buildVersion" ist die Version, die im Titel angezeigt werden soll.
Der Name der Kennung lautet "var version" unten für den Titel in settings.bundle Root.plist
Beispieleintrag in Root.plist
quelle
Ich glaube, Sie können dies auf eine Weise tun, die der Beschreibung in dieser Antwort (basierend auf diesem Beitrag ) ähnelt .
Zunächst können Sie VersionValue zu einer Variablen in Xcode machen, indem Sie sie in $ {VERSIONVALUE} umbenennen. Erstellen Sie eine Datei mit dem Namen versionvalue.xcconfig und fügen Sie sie Ihrem Projekt hinzu. Gehen Sie zu Ihrem Anwendungsziel und gehen Sie zu den Build-Einstellungen für dieses Ziel. Ich glaube, dass Sie VERSIONVALUE als benutzerdefinierte Build-Einstellung hinzufügen müssen. Ändern Sie in der unteren rechten Ecke dieses Fensters den Wert "Basierend auf" in "Versionswert".
Gehen Sie schließlich zu Ihrem Ziel und erstellen Sie eine Run Script Build-Phase. Überprüfen Sie die Phase "Skript ausführen" und fügen Sie sie in das Skriptfeld "Skript" ein. Mein Skript zum Kennzeichnen meiner BUILD_NUMBER-Einstellung mit dem aktuellen Subversion-Build lautet beispielsweise wie folgt:
Dies sollte den Trick machen, die Variable zu ersetzen, wenn sich diese Werte in Ihrem Projekt ändern.
quelle
Für mich war dies die einfachste Lösung:
Fügen Sie vor dem Schritt "Bundle-Ressourcen kopieren" eine neue Phase zum Erstellen von Skripten hinzu
Schale:
/usr/bin/env python
Inhalt:
quelle