da85a2c0d6
Phase 10 Schritt 7 lässt sich nicht abschließen, aber alles bis zur Signatur ist gebaut und belegt: Simulator- und Gerätebau (arm64, Release) laufen fehlerfrei durch, 146/146 Tests grün, Typecheck sauber. Die Signatur scheitert allein daran, dass dem Entwicklerteam kein Gerät bekannt ist -- Apple erzeugt ein Development-Profil nur für konkrete UDIDs. Kein iPhone angeschlossen, keins je mit diesem Mac gepaart, kein App-Store-Connect-Schlüssel zum Nachtragen. Neu: companion-app/scripts/ios-signieren.sh macht Bauen, Synchronisieren, Signieren und den .ipa-Export zu einem Befehl. Nötig, weil ios/ absichtlich gitignored ist und jede in Xcode geklickte Signatureinstellung beim nächsten npx cap add ios wieder verschwinden würde -- die Team-Kennung braucht eine versionierte Heimat. Bewusst nicht getan: eine unsignierte .ipa als Platzhalter einchecken. Sie wäre nicht installierbar und läge als Binärdatei dauerhaft in der Historie.
87 lines
3.9 KiB
Markdown
87 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 dem Entwicklerteam bekannt ist** (Kabel
|
|
anschließen und vertrauen, oder UDID unter developer.apple.com eintragen).
|
|
Vorher bricht Apple den Profilabruf ab - das ist die einzige verbleibende
|
|
Hürde, der Gerätebau selbst läuft fehlerfrei durch
|
|
- 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
|