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.
97 lines
4.3 KiB
Markdown
97 lines
4.3 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.
|
|
|
|
## Die signierte App
|
|
|
|
`auslieferung/App.ipa` ist der fertige, **Ad-hoc signierte** Stand (Team
|
|
`RMACS9VLS4`, Profil gültig bis 29.08.2027, nur für das eingetragene iPhone).
|
|
Neu bauen: `bash scripts/ios-signieren.sh` - baut Webbündel, synchronisiert die
|
|
Hülle, signiert und legt die `.ipa` wieder hier ab.
|
|
|
|
Beim ersten Signieren fragt der Schlüsselbund um Erlaubnis. Dort **„Immer
|
|
erlauben"** wählen, sonst hängt `xcodebuild` wortlos und endet nach Minuten mit
|
|
`errSecInternalComponent`.
|
|
|
|
## 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
|
|
- Übertragung über die Luft: `scripts/ios-luftweg.sh https://<host>` erzeugt
|
|
Manifest und Installationsseite; es fehlt nur noch ein Host, der den Ordner
|
|
über **HTTPS mit gültigem Zertifikat** ausliefert (`tailscale serve`
|
|
angedacht, dieser Mac ist dort noch abgemeldet)
|
|
- 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
|