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.plistverwendet 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 xcodeprojcli 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 CFBundleShortVersionStringund CFBundleVersionin die Ziele schreibtInfo.plist
Als Quelle der Wahrheit, verwende ich die Xcode Build - Einstellungen die Werte zu lesen MARKETING_VERSIONund CURRENT_PROJECT_VERSIONdes 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-actionSkripts. 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-actionder klicken Provide build and settings fromDrop - 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_VERSIONund angebenCURRENT_PROJECT_VERSION
Der letzte Schritt besteht darin, ein eigenes Synchronisierungsskript zu schreiben, das die Werte der bereitgestellten MARKETING_VERSIONund CURRENT_PROJECT_VERSIONder 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.plistund Settings.bundlezwischen 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.