b4d44b2731
Phase 10 Schritt 7 ist damit erledigt. auslieferung/App.ipa, 2,4 MB, Ad-hoc signiert mit "Apple Distribution: Paul Nothaft", Profil gueltig bis 29.08.2027, genau ein eingetragenes Geraet. Zwei Annahmen von heute frueh waren falsch und sind korrigiert: die bezahlte Mitgliedschaft stuft das bestehende Team hoch, statt ein neues anzulegen (die Kennung bleibt RMACS9VLS4), und der Export als Ad-hoc funktioniert einwandfrei. Neue Falle festgehalten: beim ersten Signieren fragt der Schluesselbund per Dialog um Erlaubnis. Bleibt der unbeantwortet, haengt xcodebuild wortlos und endet mit errSecInternalComponent. Die Diagnose steht in AGENTS.md, weil das Symptom von sich aus nirgendwohin zeigt. Neu: scripts/ios-luftweg.sh erzeugt manifest.plist, Installationsseite und Symbole fuer die Uebertragung ueber die Luft. Es verweigert eine Basis-Adresse ohne https, weil iOS sonst erst auf dem Telefon still scheitert. Offen bleibt der Host, der die Dateien ausliefert.
103 lines
4.1 KiB
Bash
Executable File
103 lines
4.1 KiB
Bash
Executable File
#!/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=<UDID>' -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" <<PLIST
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>method</key><string>ad-hoc</string>
|
|
<key>teamID</key><string>$TEAM</string>
|
|
<key>signingStyle</key><string>automatic</string>
|
|
<key>stripSwiftSymbols</key><true/>
|
|
</dict>
|
|
</plist>
|
|
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://<host>"
|
|
echo "Per Kabel: xcrun devicectl device install app --device <UDID> $APP/auslieferung/App.ipa"
|