Der Weg bisher
Mein Anwendungsfall war:
- Ich synchronisiere die Version und baue Nummern über mehrere Ziele hinweg.
- Ich synchronisiere die Version und erstelle Nummern mit denen des Ziels
Settigns.bundle
- Ich lese und ändere die Build-Nummer von einem CI-Server.
Ich habe Punkt 1 und 2 als Zielerstellungsskript und Punkt 3 als benutzerdefiniertes Skript auf dem CI selbst ausgeführt.
Die neue Art, die Version und den Build in den Xcode-Build-Einstellungen zu speichern, verursachte Probleme mit den Skripten, da die Werte nicht mehr effektiv geändert werden konnten. Zumindest war Lesen möglich.
Leider konnte ich keinen legitimen Weg finden, um zu verhindern, dass Xcode die Version speichert und Nummern in die Projekterstellungseinstellungen einbaut, aber ich habe es geschafft, eine Problemumgehung zu erstellen.
Es stellt sich heraus, dass beim Erstellen eines Builds oder Archivs der in geschriebene Wert Info.plist
verwendet wird. Dies bedeutet, dass der Wert während der Erstellungszeit ersetzt wird, sodass wir ihn nicht während derselben Erstellungszeit ändern können.
Ich habe auch versucht, das Projekt mit xcodeproj
cli zu ändern. Änderungen am Projekt führten jedoch dazu, dass Builds gestoppt wurden, sodass diese Lösung nicht funktionierte.
Nach vielen verschiedenen Ansätzen, die ich ausprobiert habe, habe ich es endlich geschafft, einen Kompromiss zu finden, der das neue Verhalten des Xcodes nicht verletzt.
Kurze Antwort:
Als Zielvoraktion wird ein Skript ausgeführt, das die entsprechenden Werte in CFBundleShortVersionString
und CFBundleVersion
in die Ziele schreibtInfo.plist
Als Quelle der Wahrheit, verwende ich die Xcode Build - Einstellungen die Werte zu lesen MARKETING_VERSION
und CURRENT_PROJECT_VERSION
des gewünschten Ziels.
Auf diese Weise werden beim Ändern der Werte aus den Projekteinstellungen - beim nächsten Erstellen / Archivieren - diese in das geschrieben Info.plist
, sodass Ihre vorhandene Skriptlogik weiterhin funktioniert.
Detaillierte Antwort
Die einzige Möglichkeit, eine Ressource bei einer Build-Aktion zu ändern, ist die Verwendung eines pre-action
Skripts. Wenn Sie versuchen, dies über ein Build-Skript zu tun, werden die Änderungen nicht sofort wirksam und sind am Ende des Builds / Archivs nicht vorhanden.
Um eine vorgefertigte Aktion hinzuzufügen, gehen Sie zum Bearbeitungsschema.
Erweitern Sie dann die Abschnitte Erstellen und Archivieren. Unter Pre-action
der klicken Provide build and settings from
Drop - Down und die Quelle der Wahrheit Ziel auszuwählen , von dem Sie die Werte lesen möchten.
Fügen Sie das folgende Skript hinzu:
# 1)
cd ${PROJECT_DIR}
# 2)
exec > Pruvit-Int.prebuild.sync_project_version_and_build_with_info_plists.log 2>&1
# 3)
./sync_project_version_and_build_with_info_plists.sh $MARKETING_VERSION $CURRENT_PROJECT_VERSION
Die Skriptzeilen führen Folgendes aus:
- Wechseln Sie in das Verzeichnis, in dem sich das Synchronisierungsskript befindet, um es auszuführen
- Ermöglicht das Schreiben eines Protokolls während der Voraktion, andernfalls wird jede Ausgabe standardmäßig stummgeschaltet
- Führen Sie das Synchronisierungsskript aus, indem Sie das
MARKETING_VERSION
und angebenCURRENT_PROJECT_VERSION
Der letzte Schritt besteht darin, ein eigenes Synchronisierungsskript zu schreiben, das die Werte der bereitgestellten MARKETING_VERSION
und CURRENT_PROJECT_VERSION
der jeweiligen Ziele liest und wann immer Sie möchten.
In meinem Fall lautet das Skript wie folgt:
#!/bin/bash
#IMPORTANT - this script must run as pre-action of each target's Build and Archive actions
version_number=$1
build_number=$2
echo "version_number is $version_number"
echo "build_number is $build_number"
#update Pruvit/Info.plist
pruvitInfoPlist="Pruvit/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $pruvitInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $pruvitInfoPlist
#update Pruvit/Settings.bundle
settingsPlist="Pruvit/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version_number" $settingsPlist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $build_number" $settingsPlist
#update BadgeCounter/Info.plist
badgeCounterInfoPlist="BadgeCounter/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $badgeCounterInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $badgeCounterInfoPlist
Ich verwende Shared Info.plist
und Settings.bundle
zwischen meinen beiden App-Zielen, daher muss ich dies einmal aktualisieren.
Außerdem verwende ich eine Benachrichtigungsdiensterweiterung BadgeCounter
, die genau dieselbe Version haben und als Ziel erstellt werden muss, in das sie eingebettet ist. Also aktualisiere ich das auch.