Ich habe zu meiner „Tür auf“-App ein Widget hinzugefügt. Beim Upload desselben hat mir Apple (Xcode) mitgeteilt, dass die Revisionsnummer (CFBundleVersion
) vom Widget auf 1 stünde, während die App eine andere (korrekte) hatte. Klar, mein getrevision.sh
war als Build-Step nur im App-Target eingebaut. Leider half es nichts, es 1:1 ins Widget-Target einzubauen – es musste noch etwas abstrakter werden.
Bei der Recherche hat mir v.a. diese Seite geholfen und darin v.a. dieser Tipp:
Build Settings anzeigen: xcodebuild -project YourProject.xcodeproj/ -target "Your App Target" -showBuildSettings
. Also z.B. bei mir:
xcodebuild -project tuerauf.xcodeproj/ -target "tuerauf_prod" -showBuildSettings
Danach habe ich mein neues getrevision.sh
relativ schnell fertig stellen können:
Interessant dabei sind folgende Punkte:
- Die Version (
CFBundleVersion
) wird nicht im Projektverzeichnis gepatcht, d.h. es entstehen keine git-Änderungen. Der „Trick“ ist, ins Build-Verzeichnis zu gehen:cd "$BUILT_PRODUCTS_DIR"
. - Das
Info.plist
-File wird nicht direkt angesprochen, sondern via$INFOPLIST_PATH
. Dadurch kann das Skript 1:1 auch in der Widget-Extension benutzt werden. - Die Berechnung der Revisionsnummer ist Philosophie-Frage: Hier in meinem Fall wird die Zahl der Checkins auf dem aktuellen git-Branch gezählt (und aus historischen Gründen 100 hinzugezählt…).
- Die Version wird außerdem im
Info.plist
-File desdSYM
-Archivs gesetzt. Ich bin mir nicht ganz sicher warum das wichtig ist – vermutlich damit die Debugging-Symbole der richtigen Version zugeordnet werden können. - Neben der wichtigen
CFBundleVersion
wird noch ein „selbst erfundener“ EintragCFBundleVersionDetails
hinzugefügt. Dieser wird – zusammen mitCFBundleShortVersionString
innerhalb der App benutzt um Detail-Infos zur Version auszugeben.Das sieht dann z.B. so aus:
1.1.2 145-d1be530 M
:- Versionsnummer
- Revisionsnummer (Git-Checkin-Count)
- Git-Hash
- „M“, wenn es noch Modifikationen gegenüber der eingecheckten git-Version gab (es sich also nicht exakt um die eingecheckte Version handelt.)
Anhang: getgitrevision.sh
#!/bin/bash
set -x
cd "$PROJECT_DIR"
REVCOUNT=$(git rev-list --count HEAD)
let BUILD_VERSION=$REVCOUNT+100
GITHASH=$(git rev-list --max-count=1 --pretty=format:%h HEAD | tail -1)
GITMODIFIED=$(git diff --quiet HEAD || echo " M")
BUILD_VERSION_DETAILS=`echo "$BUILD_VERSION-$GITHASH$GITMODIFIED"`
cd "$BUILT_PRODUCTS_DIR"
# RELEASE_VERSION=$(/usr/libexec/PListBuddy -c "Print CFBundleShortVersionString" $INFOPLIST_PATH)
/usr/libexec/PListBuddy -c "Set :CFBundleVersion $BUILD_VERSION" $INFOPLIST_PATH
/usr/libexec/PListBuddy -c "Set :CFBundleVersion $BUILD_VERSION" $DWARF_DSYM_FILE_NAME/Contents/Info.plist
# CFBundleVersionDetails = our own new key
/usr/libexec/PListBuddy -c "Delete :CFBundleVersionDetails" $INFOPLIST_PATH || true
/usr/libexec/PListBuddy -c "Add :CFBundleVersionDetails string $BUILD_VERSION_DETAILS" $INFOPLIST_PATH