iOS-Entwicklung: Revisionsnummer patchen

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 des dSYM-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” Eintrag CFBundleVersionDetails hinzugefügt. Dieser wird – zusammen mit CFBundleShortVersionString 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert