0e16f68b4b
Der vorige Commit ging von einer bezahlten Mitgliedschaft aus und nannte als
Ausweg, die UDID auf developer.apple.com einzutragen. Das ist falsch.
Xcodes eigener Zwischenspeicher belegt das Gegenteil:
isFreeProvisioningTeam = 1, teamType = "Personal Team". Damit gibt es gar
keine Geräteverwaltung im Portal -- ein Gerät wird ausschließlich dadurch
bekannt, dass es angeschlossen und vertraut ist. Zusätzlich verfallen Profil,
App-ID und Geräteeintrag alle 7 Tage.
Auch die ältere Behauptung weiter oben in AGENTS.md ("Paul has an Apple
Developer Program") ist damit als falsch markiert.
Offen und bewusst als ungeprüft vermerkt: ob -exportArchive mit einem
Personal Team überhaupt eine brauchbare .ipa liefert. Der direkte Weg aufs
angeschlossene Gerät steht als Rückfallebene im Skriptkopf.
88 lines
3.9 KiB
Markdown
88 lines
3.9 KiB
Markdown
# companion-app — DataMetric360
|
|
|
|
Private Fahrzeug-App für einen Audi RS 4 Avant competition. Läuft als Web-App
|
|
im Browser, als PWA auf dem Homescreen, später über Capacitor nativ auf
|
|
iOS/Android und eingebettet als Iframe im Home-Assistant-Dashboard.
|
|
|
|
**Kein eigenes Backend.** Die App spricht direkt mit der REST- und
|
|
WebSocket-Schnittstelle von Home Assistant und ruft dieselben
|
|
`pyscript.audi_dashboard_*`-Dienste auf wie das bestehende Panel. Alle Daten
|
|
liegen auf dem eigenen Server; das Gerät hält nur den Zugangstoken und einen
|
|
Zwischenspeicher für die Offline-Anzeige.
|
|
|
|
Architektur: `../COMPANION_APP_ARCHITECTURE.md` · Umsetzungsschritte:
|
|
`../UMSETZUNGSPLAN.md` · Projektstand: `../AGENTS.md`
|
|
|
|
## Loslegen
|
|
|
|
```bash
|
|
npm install # im Repo-Wurzelverzeichnis, nicht hier (npm-Workspace)
|
|
npm run build:ds # Design-System bauen, die App importiert aus dessen dist/
|
|
npm run dev --workspace datametric360
|
|
```
|
|
|
|
Beim ersten Start fragt die App nach Server-Adresse und Zugangstoken. Für die
|
|
Entwicklung setzt `../testumgebung/aufsetzen.sh` eine vollständige
|
|
Home-Assistant-Instanz mit dem echten Backend auf.
|
|
|
|
## Aufbau
|
|
|
|
| Ordner | Inhalt |
|
|
|---|---|
|
|
| `src/api/` | Datenschicht: REST, WebSocket mit Wiederverbindung, Offline-Warteschlange, Zugangsdaten |
|
|
| `src/daten/` | Fachlogik: Profil-Umrechnung, Statistik, Service-Prognose, Datenkontext |
|
|
| `src/screens/` | Die 21 Seiten der App |
|
|
| `src/stile/` | Layout, Bildschirmbausteine, Audi-Schrift |
|
|
| `src/assets/audi/` | Schrift, Vier-Ringe, Typenschilder — **lizenzpflichtig, siehe unten** |
|
|
| `src/tests/` | Testaufbau und Beispieldaten |
|
|
|
|
Gestaltung kommt vollständig aus `@audi-dash/ui` (`../design-system/`). Neue
|
|
Komponenten entstehen dort, nicht hier.
|
|
|
|
## Prüfen
|
|
|
|
```bash
|
|
npm run typecheck # TypeScript, sehr streng (exactOptionalPropertyTypes u. a.)
|
|
npm run test # 90 Tests: Rechenlogik, Layoutwechsel, alle Seiten gerendert
|
|
npm run smoke # Adressbildung und Endpunkte, ohne Token
|
|
npm run smoke:auth # gegen die laufende Testinstanz, mit Token
|
|
npm run build # Produktionsbündel
|
|
```
|
|
|
|
`smoke:auth` liest Adresse und Token aus `.env.local` (schreibt
|
|
`../testumgebung/aufsetzen.sh`, gitignored). Ohne die Datei überspringt der
|
|
Test sich selbst, statt fehlzuschlagen.
|
|
|
|
Die Rendertests decken alle 21 Seiten in beiden Layouts ab — schmal mit
|
|
Tab-Leiste, breit mit Seitenleiste.
|
|
|
|
## Rechtlicher Hinweis
|
|
|
|
`src/assets/audi/` enthält die Hausschrift Audi Type, das Vier-Ringe-Zeichen
|
|
und die Modell-Typenschilder. Diese sind lizenz- beziehungsweise
|
|
markenrechtlich geschützt und ausschließlich für diese eine private,
|
|
unveröffentlichte Installation freigegeben (`../bauauftrag.md` §8/§12).
|
|
|
|
Daraus folgt: **Die App wird nur seitlich installiert, nie in einem App Store
|
|
veröffentlicht**, und dieses Repository bleibt privat. `../design-system/`
|
|
kommt bewusst ohne diese Dateien aus, weil es nach außen hochgeladen wird —
|
|
dort niemals Markendateien ablegen.
|
|
|
|
## Noch offen
|
|
|
|
- Native Hülle selbst: `ios/`/`android/` (von `npx cap add` erzeugt, absichtlich
|
|
gitignored) existieren in keinem Checkout dauerhaft und müssen auf einem Mac
|
|
(für iOS zwingend, Xcode) neu erzeugt werden - die sichere Tokenablage
|
|
(Keychain/Keystore) ist dagegen bereits vollständig angebunden
|
|
(`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 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. 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
|