Signierte iOS-App gebaut und Luftweg-Installation vorbereitet

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.
This commit is contained in:
Paul Nothaft
2026-08-29 12:56:42 +02:00
parent fa7253a64c
commit b4d44b2731
6 changed files with 257 additions and 85 deletions
+31 -21
View File
@@ -424,12 +424,16 @@ nicht ein Riesencommit.
> Offen bleibt allein das Signieren aufs eigene Gerät — das braucht das
> angeschlossene iPhone und die Apple-ID des Besitzers.
>
> **2026-08-29:** Schritt 7 vorbereitet, aber nicht abschließbar. Der Gerätebau
> (arm64, Release) läuft fehlerfrei durch, das Signieren scheitert
> ausschließlich daran, dass dem Team `RMACS9VLS4` **kein Gerät** bekannt ist:
> Apple erzeugt ein Development-Profil nur für konkrete UDIDs. Der ganze
> Ablauf steckt jetzt in `companion-app/scripts/ios-signieren.sh` und läuft
> bis genau zu diesem Punkt. Details in `AGENTS.md` Abschnitt AI.
> **2026-08-29: Schritt 7 erledigt.** Der Besitzer hat das bezahlte
> Entwicklerkonto gelöst und das iPhone im Portal registriert; die Team-Kennung
> blieb dabei `RMACS9VLS4` (die bezahlte Mitgliedschaft stuft das bestehende
> Team hoch, sie legt kein neues an). Ergebnis: `companion-app/auslieferung/App.ipa`,
> 2,4 MB, **Ad-hoc** signiert mit `Apple Distribution: Paul Nothaft`, Profil
> gültig bis 29.08.2027. Zwei Skripte tragen das:
> `scripts/ios-signieren.sh` (bauen und signieren) und `scripts/ios-luftweg.sh`
> (Manifest und Installationsseite für die Übertragung über die Luft).
> Offen bleibt allein ein HTTPS-Host, der die Dateien ausliefert — siehe
> Schritt 8. Fallstricke und Diagnosen in `AGENTS.md` Abschnitt AI.
**Ziel:** Die App läuft auf dem iPhone. Zwei Stufen — erst PWA (sofort nutzbar), dann Capacitor
(Keychain + QR-Scan).
@@ -456,21 +460,27 @@ nicht ein Riesencommit.
(Offline-JS-QR-Bibliothek, keine Netzabfrage) als QR anzeigt. Inhalt des QR: JSON
`{"url": "...", "token": "..."}`. Wenn das zusammen > 1 Tag Aufwand wird: weglassen —
manuelles Einfügen ist die beschlossene, ausreichende Lösung.
7. **iOS-Sideload:** statt Xcode von Hand jetzt `bash companion-app/scripts/ios-signieren.sh`
(baut Webbündel, synchronisiert die Hülle, archiviert signiert, exportiert die `.ipa`).
Die Team-Kennung steht im Skript, weil `ios/` gitignored ist und jede in Xcode geklickte
Einstellung beim nächsten `npx cap add ios` verschwinden würde.
⚠️ **Voraussetzung, die kein Skript herstellen kann:** das iPhone muss **per Kabel an diesem
Mac hängen und vertraut sein**. Sonst: „Your team has no devices from which to generate a
provisioning profile". Die UDID stattdessen auf developer.apple.com einzutragen geht **nicht** —
das ist ein Recht der bezahlten Mitgliedschaft, und das Konto ist ein kostenloses Personal Team
(`isFreeProvisioningTeam = 1`, belegt 2026-08-29, siehe `AGENTS.md` Abschnitt AI).
⚠️ Entscheidungspunkt für den Besitzer, jetzt mit bekannter Faktenlage: das Konto **ist**
kostenlos, die Signatur läuft also alle **7 Tage** ab (Profil, App-ID und Geräteeintrag
gleichermaßen — App wöchentlich neu aufspielen). Ein bezahltes Entwicklerkonto (99 €/Jahr)
macht daraus 1 Jahr und erlaubt die Geräteregistrierung ohne angeschlossenes Telefon.
Bei 7-Tage-Schmerz ist die PWA-Stufe die Alltagslösung, Capacitor das Extra für Keychain/QR.
8. ✅ Fertig wenn: App startet nativ auf dem iPhone, Token liegt im Keychain (Test: App löschen und
7. **iOS-Sideload (erledigt 2026-08-29):** `bash companion-app/scripts/ios-signieren.sh`
baut Webbündel, synchronisiert die Hülle, archiviert signiert und exportiert die `.ipa`
nach `companion-app/auslieferung/`. Die Team-Kennung steht im Skript, weil `ios/` gitignored
ist und jede in Xcode geklickte Einstellung beim nächsten `npx cap add ios` verschwinden würde.
Der Entscheidungspunkt Kostenlos-vs-Bezahlt ist entschieden: **bezahltes Konto**, damit
Signatur ein Jahr gültig statt sieben Tage, und Geräteregistrierung über das Portal ohne
angeschlossenes Telefon.
⚠️ **Falle, die viel Zeit kostet:** beim ersten Signieren fragt der Schlüsselbund per Dialog
um Erlaubnis. Wird der nicht beantwortet, hängt `xcodebuild` wortlos minutenlang und endet
mit `errSecInternalComponent`. Im Dialog **„Immer erlauben"** wählen — ein Archiv signiert
über 25 Binärdateien und würde sonst jedes Mal erneut fragen.
8. **Übertragung über die Luft** (statt Kabel): `bash companion-app/scripts/ios-luftweg.sh
https://<host>` erzeugt `manifest.plist`, Installationsseite und Symbole in
`ios/build/luftweg/`. Der Ordner muss über **HTTPS mit öffentlich vertrauenswürdigem
Zertifikat** ausgeliefert werden — iOS lehnt einfaches HTTP und selbstsignierte Zertifikate
ab, Home Assistant unter `/local/` genügt also **nicht**. Passend: `tailscale serve --bg
<ordner>` (echtes Let's-Encrypt-Zertifikat auf `*.ts.net`, kein offener Port, iPhone ohnehin
im Tailnet); der Cloudflare-Tunnel aus Phase 12 täte es später ebenso. Link auf dem iPhone in
**Safari** öffnen — andere Browser reichen `itms-services://` nicht ans System weiter.
⏳ Offen: dieser Mac ist bei Tailscale abgemeldet, es läuft also noch kein Host.
9. ✅ Fertig wenn: App startet nativ auf dem iPhone, Token liegt im Keychain (Test: App löschen und
neu installieren → Token weg; Backup/Restore-Verhalten notieren), QR-Einrichtung funktioniert
oder ist dokumentiert entfallen.
9. Committen; `AGENTS.md` Block A Punkte QR/Secure-Storage abhaken.