diff --git a/companion-app/scripts/ios-signieren.sh b/companion-app/scripts/ios-signieren.sh index 9f7a076..e48c253 100755 --- a/companion-app/scripts/ios-signieren.sh +++ b/companion-app/scripts/ios-signieren.sh @@ -94,6 +94,17 @@ npx cap sync ios # Nur "WhenInUse": berechnet wird der Abstand zum geparkten Fahrzeug, waehrend # jemand die Standort-Seite ansieht. Hintergrundortung braucht die App nicht, # und was sie nicht braucht, soll sie auch nicht erfragen. +echo "==> Standort-Berechtigung eintragen" +PLIST="ios/App/App/Info.plist" +GRUND="Zeigt auf der Standort-Karte, wie weit du vom geparkten Fahrzeug entfernt bist." +if ! /usr/libexec/PlistBuddy -c "Set :NSLocationWhenInUseUsageDescription $GRUND" "$PLIST" 2>/dev/null; then + /usr/libexec/PlistBuddy -c "Add :NSLocationWhenInUseUsageDescription string $GRUND" "$PLIST" +fi +/usr/libexec/PlistBuddy -c "Print :NSLocationWhenInUseUsageDescription" "$PLIST" >/dev/null || { + echo "FEHLER: NSLocationWhenInUseUsageDescription liess sich nicht setzen." >&2 + exit 1 +} + # Share-Erweiterung ins Xcode-Projekt haengen. # # Aus demselben Grund wie die Team-Kennung und der Standort-Schluessel oben: @@ -108,15 +119,55 @@ npx cap sync ios echo "==> Share-Erweiterung einrichten" node scripts/ios-teilen-einrichten.mjs -echo "==> Standort-Berechtigung eintragen" -PLIST="ios/App/App/Info.plist" -GRUND="Zeigt auf der Standort-Karte, wie weit du vom geparkten Fahrzeug entfernt bist." -/usr/libexec/PlistBuddy -c "Set :NSLocationWhenInUseUsageDescription $GRUND" "$PLIST" 2>/dev/null \ - || /usr/libexec/PlistBuddy -c "Add :NSLocationWhenInUseUsageDescription string $GRUND" "$PLIST" -/usr/libexec/PlistBuddy -c "Print :NSLocationWhenInUseUsageDescription" "$PLIST" >/dev/null || { - echo "FEHLER: NSLocationWhenInUseUsageDescription liess sich nicht setzen." >&2 - exit 1 -} +# Versionsnummer aus der manifest.json in die App schreiben. +# +# Capacitors Vorlage setzt 1.0/1 und laesst es dabei - zwei nacheinander +# aufgespielte .ipa sind auf dem Geraet dadurch nicht zu unterscheiden, und +# man weiss nicht, welche gerade drauf ist. Dieselbe Zahl, die schon Panel, +# OTA-Buendel und __APP_VERSION__ tragen (siehe VERSIONIERUNG.md): eine +# Quelle, kein zweiter Ort zum Vergessen. +echo "==> Versionsnummer eintragen" +VERSION="$(node -p "require('../custom_components/audi_dashboard/manifest.json').version")" +[ -n "$VERSION" ] || { echo "FEHLER: keine Version in der manifest.json." >&2; exit 1; } +if ! /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $VERSION" "$PLIST" 2>/dev/null; then + /usr/libexec/PlistBuddy -c "Add :CFBundleShortVersionString string $VERSION" "$PLIST" +fi +echo " $VERSION" + +# Zwischengespeicherte Bereitstellungsprofile dieser App wegraeumen. +# +# `-allowProvisioningUpdates` zieht ein neues Profil nur, wenn kein passendes +# herumliegt - ein vorhandenes wird stillschweigend weiterbenutzt, auch wenn +# sich seither die Berechtigungen geaendert haben. Genau daran ist am +# 2026-08-29 eine Installation gescheitert ("Integritaet konnte nicht +# geprueft werden"): das eingebettete Profil kannte ein Geraet, das Team +# hatte inzwischen zwei. Mit der App-Gruppe der Share-Erweiterung ist +# derselbe Fall erneut eingetreten - jedes vor dem 2026-08-31 gezogene +# Profil kennt sie nicht. +# +# Weggeraeumt wird nur, was zu dieser App gehoert (Bundle-ID im entpackten +# Profil gesucht), nicht der ganze Ordner - dort liegen auch die Profile +# anderer Projekte. Mit --profile-behalten laesst sich der Schritt +# ueberspringen. +if [ "${1:-}" != "--profile-behalten" ]; then + echo "==> Alte Bereitstellungsprofile wegraeumen" + PROFILE="$HOME/Library/Developer/Xcode/UserData/Provisioning Profiles" + if [ -d "$PROFILE" ]; then + ANZAHL=0 + for datei in "$PROFILE"/*.mobileprovision; do + [ -e "$datei" ] || continue + if security cms -D -i "$datei" 2>/dev/null | grep -qF "app.datametric360"; then + rm -f "$datei" + ANZAHL=$((ANZAHL + 1)) + fi + done + echo " $ANZAHL entfernt - xcodebuild zieht sie gleich neu" + else + echo " keine vorhanden" + fi +else + echo "==> Bereitstellungsprofile bleiben (--profile-behalten)" +fi echo "==> Archiv bauen und signieren (Team $TEAM)" rm -rf "$AUSGABE" @@ -161,7 +212,30 @@ xcodebuild -exportArchive \ mkdir -p "$APP/auslieferung" cp "$AUSGABE/App.ipa" "$APP/auslieferung/App.ipa" +# Auslieferung ueber die Luft gleich mitschreiben. +# +# manifest.plist und die Installationsseite hingen bisher an einem zweiten, +# von Hand aufzurufenden Skript - und ohne sie ist die frische .ipa auf dem +# Telefon nicht installierbar, obwohl sie fertig im Repo liegt. Ein Schritt, +# den man vergessen kann, gehoert in den Bau. +# +# Die Basis-Adresse ist die des Gitea-Repos: es liefert die Dateien bereits +# ueber HTTPS mit oeffentlich vertrauenswuerdigem Zertifikat aus, was iOS +# fuer diesen Weg zwingend verlangt (siehe ios-luftweg.sh). Ueberschreibbar +# ueber LUFTWEG_BASIS, falls der Weg einmal ueber einen eigenen Host geht. +echo "==> Auslieferung ueber die Luft vorbereiten" +LUFTWEG_BASIS="${LUFTWEG_BASIS:-https://gitea.nothaft.cloud/paul/audi-app/raw/branch/main/companion-app/auslieferung}" +bash "$HIER/ios-luftweg.sh" "$LUFTWEG_BASIS" auslieferung + echo echo "Fertig: $APP/auslieferung/App.ipa" -echo "Ueber die Luft: bash scripts/ios-luftweg.sh https://" -echo "Per Kabel: xcrun devicectl device install app --device $APP/auslieferung/App.ipa" +echo "Version: $VERSION" +echo +echo "Noch zu tun:" +echo " 1. git add companion-app/auslieferung && git commit && git push" +echo " (die .ipa und manifest.plist muessen im Repo liegen, sonst kann" +echo " das Telefon sie nicht laden)" +echo " 2. Auf dem iPhone in Safari oeffnen:" +echo " itms-services://?action=download-manifest&url=$LUFTWEG_BASIS/manifest.plist" +echo +echo "Per Kabel stattdessen: xcrun devicectl device install app --device $APP/auslieferung/App.ipa"