#!/usr/bin/env bash # Baut die native iOS-Huelle und signiert sie zu einer installierbaren .ipa. # Nur auf einem Mac mit Xcode lauffaehig. Siehe ../../UMSETZUNGSPLAN.md Phase 10. # # Warum es dieses Skript gibt: `ios/` ist absichtlich gitignored (aus dem # Webbuendel jederzeit wiederherstellbar). Damit verschwindet aber auch jede # Signatureinstellung, die man in Xcode von Hand setzt, beim naechsten # `npx cap add ios` wieder. Die Team-Kennung gehoert deshalb hierher - in eine # versionierte Datei - und wird dem Build von aussen mitgegeben. # # Voraussetzung, die dieses Skript nicht herstellen kann: das iPhone muss # per Kabel an diesem Mac haengen und vertraut sein. Apple erzeugt ein # Development-Profil nur fuer konkrete Geraete, und dieses Konto ist ein # kostenloses Personal Team - da gibt es keine Geraeteverwaltung auf # developer.apple.com, das Anmelden der Geraetekennung macht Xcode selbst ueber # -allowProvisioningUpdates am angeschlossenen Telefon. Ohne Telefon bricht der # Archivschritt mit "Your team has no devices" ab; das ist kein Fehler im # Projekt. # # Ebenfalls Folge des kostenlosen Kontos: Profil, App-ID und Geraeteeintrag # verfallen nach 7 Tagen, die App muss dann neu aufgespielt werden. # # Ungeprueft, weil bisher kein Geraet zur Verfuegung stand: ob der # -exportArchive-Schritt mit einem Personal Team ueberhaupt eine brauchbare # .ipa liefert. Kostenloses Signieren ist auf "direkt aufs angeschlossene # Geraet starten" ausgelegt, nicht auf ein weitergebbares Archiv. Scheitert der # Export, ist der direkte Weg der richtige, nicht die Fehlersuche am Export: # xcodebuild -project ios/App/App.xcodeproj -scheme App \ # -destination 'id=' -allowProvisioningUpdates \ # DEVELOPMENT_TEAM=$TEAM install set -euo pipefail HIER="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" APP="$(dirname "$HIER")" # Dieselbe Kennung wie zu Zeiten des kostenlosen Kontos: die bezahlte # Mitgliedschaft hat das bestehende Team hochgestuft, statt ein neues # anzulegen. Zwischenzeitlich stand hier das Gegenteil - widerlegt am # 2026-08-29 durch das ausgestellte Profil (Team RMACS9VLS4, Laufzeit ein # Jahr statt sieben Tage). Ueberschreibbar ueber APPLE_TEAM_ID. TEAM="${APPLE_TEAM_ID:-RMACS9VLS4}" AUSGABE="$APP/ios/build" ARCHIV="$AUSGABE/DataMetric360.xcarchive" cd "$APP" echo "==> Webbuendel bauen" npm run build echo "==> Native Huelle synchronisieren" if [ ! -d ios ]; then echo "==> ios/ fehlt, wird neu erzeugt" npx cap add ios fi npx cap sync ios echo "==> Archiv bauen und signieren (Team $TEAM)" rm -rf "$AUSGABE" mkdir -p "$AUSGABE" xcodebuild \ -project ios/App/App.xcodeproj \ -scheme App \ -configuration Release \ -destination 'generic/platform=iOS' \ -archivePath "$ARCHIV" \ -allowProvisioningUpdates \ DEVELOPMENT_TEAM="$TEAM" \ archive # Ad-hoc, nicht development: das ist die von Apple vorgesehene Art fuer die # Installation ueber die Luft (siehe ios-luftweg.sh) und deckt den Weg per # Kabel gleich mit ab. Sie verlangt ein Apple-Distribution-Zertifikat, das # -allowProvisioningUpdates bei Bedarf selbst anlegt - moeglich erst seit der # bezahlten Mitgliedschaft. Die Signatur laeuft damit ein Jahr. cat > "$AUSGABE/ExportOptions.plist" < methodad-hoc teamID$TEAM signingStyleautomatic stripSwiftSymbols PLIST echo "==> .ipa exportieren" xcodebuild -exportArchive \ -archivePath "$ARCHIV" \ -exportOptionsPlist "$AUSGABE/ExportOptions.plist" \ -exportPath "$AUSGABE" \ -allowProvisioningUpdates # Die fertige .ipa liegt versioniert unter auslieferung/, weil ios/ gitignored # ist und das Ergebnis sonst nur auf diesem einen Mac existierte. mkdir -p "$APP/auslieferung" cp "$AUSGABE/App.ipa" "$APP/auslieferung/App.ipa" 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"