diff --git a/AGENTS.md b/AGENTS.md index 766c63d..dd766d1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1430,7 +1430,8 @@ wraps the web app for iPhone; a PWA home-screen install is the accepted intermed panel fix and feature from the six days since (HIG audit rounds, receipt upload, trip editing, Inspektion forecast, ...) existed only in `homeassistant/www/audi-dashboard-app.js`. User decision: port everything now, before any native build work (Android build itself - deprioritized/uncertain per the user - Paul has an Apple Developer Program and will help with + deprioritized/uncertain per the user - Paul has an Apple Developer Program **[WRONG, see + section AI: it is a free Personal Team, not a paid membership]** and will help with iOS signing). Audited both codebases field-by-field (not by diffing the panel's CSS/markup, which doesn't transfer to `@audi-dash/ui` components) and found six real, mechanically distinct gaps, all fixed: @@ -4612,22 +4613,43 @@ What was verified on this machine (Xcode 26.4, Node 22.20, `main` at `2026.8.28. nothing but provisioning is missing. **The blocker, verbatim from Apple:** `Communication with Apple failed: Your team has no devices -from which to generate a provisioning profile.` The developer account authenticates fine (Xcode -reached Apple and got a real answer, not an auth error) — team `RMACS9VLS4`, certificate +from which to generate a provisioning profile.` The account authenticates fine (Xcode reached Apple +and got a real answer, not an auth error) — team `RMACS9VLS4`, certificate `Apple Development: paul.nothaft@me.com (C9L892Z59P)`, valid until 2027-07-17. Apple issues a development profile only for **named devices**, and this team has none registered. No iPhone is -connected (`xcrun devicectl list devices` → none), no device was ever paired with this Mac (no -`~/Library/Developer/CoreDevice`, no iOS DeviceSupport), and no App Store Connect API key exists -to register one remotely. There is no route around this from a machine with no phone attached: +connected (`xcrun devicectl list devices` → none) and no device was ever paired with this Mac (no +`~/Library/Developer/CoreDevice`, no iOS DeviceSupport). There is no route around this from a +machine with no phone attached: - development / ad-hoc profiles both require registered UDIDs; - an App-Store-method export needs no devices but produces an IPA that iOS refuses to sideload; - a locally `codesign`-ed `.app` without an embedded profile will not install either. -**What to do (owner, one minute, once):** connect the iPhone by cable and tap "Trust", then run -the script below — Xcode registers the UDID itself via `-allowProvisioningUpdates`. Alternative if -the phone is elsewhere: add its UDID under developer.apple.com → Certificates, Identifiers & -Profiles → Devices. After that the device stays registered and the step never repeats. +**Correction, same day: this is a FREE account, not a paid membership.** Xcode's own cache says so +— `defaults read com.apple.dt.Xcode` → `IDEProvisioningTeamByIdentifier`: +`teamName = "Paul Nothaft (Personal Team)"`, `teamType = "Personal Team"`, +**`isFreeProvisioningTeam = 1`**. The note further up this file claiming "Paul has an Apple +Developer Program" (section on the 2026-08-17 port) is therefore **wrong** and must not be relied +on. Consequences, all confirmed against Apple's membership comparison and the free-provisioning +limits: + +- **There is no portal route to register a device.** Certificates, Identifiers & Profiles device + management is a paid-membership feature. A free team registers a device only by having it + **physically connected to this Mac and trusted**; Xcode then does it via + `-allowProvisioningUpdates`. So "add the UDID on the website" is not an option here. +- **Everything expires after 7 days** — provisioning profile, App ID and device registration alike. + The app stops launching and has to be rebuilt and reinstalled, forever, every week. +- Ceilings: 3 devices per platform, 10 App IDs per 7 days. +- Whether `-exportArchive` even yields a usable `.ipa` for a free team is **untested and doubtful** + — free provisioning is built around "Run straight onto the connected device" from Xcode, not + around exporting a redistributable archive. If the export step fails once a phone is attached, + install directly instead of debugging the export. + +**What to do (owner):** connect the iPhone by cable, tap "Trust", then run the script below. That +is the only path with this account type. If the weekly re-install turns out to be intolerable, the +paid Apple Developer Program (99 €/year) is what buys the 1-year signature, portal-side UDID +registration without the phone present, and 100 devices — `UMSETZUNGSPLAN.md` Phase 10 already +flagged this as an owner decision, and it is now a decision with a known answer on one side. **What was built instead of a hand-clicked Xcode signature:** `companion-app/scripts/ios-signieren.sh` — build → `cap sync` → signed archive → `.ipa` export, one command. It exists because `ios/` is diff --git a/UMSETZUNGSPLAN.md b/UMSETZUNGSPLAN.md index 4cb9ab6..690add0 100644 --- a/UMSETZUNGSPLAN.md +++ b/UMSETZUNGSPLAN.md @@ -460,11 +460,15 @@ nicht ein Riesencommit. (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. - ⚠️ **Einmalige Voraussetzung, die kein Skript herstellen kann:** das iPhone muss dem Team - bekannt sein — Kabel anschließen und vertrauen, oder UDID unter developer.apple.com - eintragen. Sonst: „Your team has no devices from which to generate a provisioning profile". - ⚠️ Entscheidungspunkt für den Besitzer: mit kostenlosem Apple-Konto läuft die Signatur nach - **7 Tagen** ab (App neu aufspielen); ein bezahltes Entwicklerkonto (99 €/Jahr) macht 1 Jahr. + ⚠️ **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 neu installieren → Token weg; Backup/Restore-Verhalten notieren), QR-Einrichtung funktioniert diff --git a/companion-app/README.md b/companion-app/README.md index 9fd0521..2b5a4f1 100644 --- a/companion-app/README.md +++ b/companion-app/README.md @@ -77,10 +77,11 @@ dort niemals Markendateien ablegen. (`src/api/ablageNativ.ts`, von `main.tsx` aktiviert) und wird automatisch aktiv, sobald die Hülle existiert - Signierte `.ipa`: `scripts/ios-signieren.sh` baut und signiert in einem - Durchlauf, **sobald das iPhone dem Entwicklerteam bekannt ist** (Kabel - anschließen und vertrauen, oder UDID unter developer.apple.com eintragen). + Durchlauf, **sobald das iPhone per Kabel am Mac hängt und vertraut ist**. Vorher bricht Apple den Profilabruf ab - das ist die einzige verbleibende - Hürde, der Gerätebau selbst läuft fehlerfrei durch + Hürde, der Gerätebau selbst läuft fehlerfrei durch. Das Konto ist ein + kostenloses Personal Team: die UDID lässt sich nicht auf developer.apple.com + nachtragen, und die Signatur verfällt alle 7 Tage - QR-Einrichtung als Alternative zum Einfügen des Tokens - Live-Ansicht der laufenden Fahrt: gebaut, aber über `src/funktionen.ts` abgeschaltet, bis der FMM003 echte Werte liefert diff --git a/companion-app/scripts/ios-signieren.sh b/companion-app/scripts/ios-signieren.sh index 26dc906..9a51ed7 100755 --- a/companion-app/scripts/ios-signieren.sh +++ b/companion-app/scripts/ios-signieren.sh @@ -8,12 +8,26 @@ # `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 dem -# Entwicklerteam bekannt sein. Apple erzeugt ein Development-Profil nur fuer -# konkrete Geraete. Also entweder das iPhone per Kabel anschliessen und -# vertrauen (Xcode meldet die Geraetekennung dann selbst an), oder die UDID -# unter developer.apple.com/account eintragen. Ohne das bricht der Archivschritt -# mit "Your team has no devices" ab - das ist kein Fehler im Projekt. +# 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)"