1354ca6b06
HACS kann laut eigener Dokumentation grundsätzlich nicht mit privaten GitHub-Repositories arbeiten (hacs.xyz/docs/faq/private_repositories) - keine Ausnahme für Tokens oder verbundene Konten. Meine frühere Annahme, HACS käme damit zurecht, wenn es unter dem richtigen Konto angemeldet ist, war falsch. Da das Repository aus Lizenzgründen privat bleiben muss (Audi-Hausschrift, Typenschilder), ist install.ps1 damit nicht die Rückfallebene, sondern der einzige Installationsweg - README, INSTALL.md, ANLEITUNG.md, install.ps1 und VERSIONIERUNG.md korrigiert. Oberflächen-Updates für die iOS-App laufen jetzt ohne Xcode: @capgo/capacitor-updater eingebaut, ein Update-Abschnitt in den Einstellungen lädt ein neues Bündel und tauscht die Oberfläche aus. Kein Selbstlauf (autoUpdate: false) - nur auf Tastendruck, nie während der Benutzung. Das Bündel liegt in der Integration selbst (custom_components/audi_dashboard/frontend/app/), nicht unter /local/: so reist es bei jeder Installation automatisch mit, ohne zweiten Auslieferungsweg. Gebaut von companion-app/scripts/ota-paket.ps1 (neuer Befehl: npm run ota), gemeldet über sensor.audi_dashboard_app_version (neues Feld daten.buendel). Ein echter Bug beim Bauen gefunden: [IO.Compression.ZipFile]::CreateFrom- Directory schreibt unter Windows PowerShell 5.1 Backslashes in die Zip-Einträge - iOS hätte das Archiv falsch entpackt. Behoben, indem die Einträge von Hand mit "/" geschrieben werden. Rückfallebene: notifyAppReady() läuft erst, wenn React nachweislich gerendert hat (App.tsx). Kommt diese Meldung nicht, rollt das Plugin nach 20 Sekunden von selbst auf das vorherige Bündel zurück. Am laufenden Testcontainer verifiziert: die ausgelieferte Zip hasht exakt auf den in bundle.json hinterlegten Wert, 13 Einträge, index.html in der Wurzel, keine Backslashes, keine Beschädigung. tsc sauber, 117/117 Tests (5 davon neu für buendelPasst() - dabei eine echte Lücke gefunden: die Funktion hätte bei unbekannter eigener Version fälschlich ein Update angeboten, jetzt genauso vorsichtig wie versionVergleichen). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
73 lines
3.0 KiB
TypeScript
73 lines
3.0 KiB
TypeScript
import type { CapacitorConfig } from "@capacitor/cli"
|
|
|
|
/**
|
|
* Capacitor-Konfiguration für die native Hülle.
|
|
*
|
|
* Nur Sideload, nie App Store: die Audi-Schrift und die Typenschilder sind
|
|
* ausschließlich für diese eine private Installation freigegeben.
|
|
*
|
|
* Ablauf: `npm run build && npx cap sync`, dann `npx cap open ios` und in
|
|
* Xcode signieren. Siehe `../UMSETZUNGSPLAN.md` Phase 10.
|
|
*/
|
|
const konfiguration: CapacitorConfig = {
|
|
appId: "app.datametric360",
|
|
appName: "DataMetric360",
|
|
webDir: "dist",
|
|
server: {
|
|
// https, damit die App als sicherer Ursprung gilt — sonst verweigern
|
|
// Browser-Bausteine wie die Zwischenablage ihren Dienst.
|
|
androidScheme: "https",
|
|
iosScheme: "https",
|
|
},
|
|
ios: {
|
|
// Die App zeichnet bis unter die Statusleiste und hält den sicheren
|
|
// Bereich selbst über env(safe-area-inset-*) frei.
|
|
contentInset: "never",
|
|
backgroundColor: "#161b23",
|
|
},
|
|
android: {
|
|
backgroundColor: "#161b23",
|
|
},
|
|
plugins: {
|
|
// Leitet fetch() über die native HTTP-Schicht statt über die WebView.
|
|
//
|
|
// Das ist hier nicht Feinschliff, sondern notwendig: Die native Hülle
|
|
// liefert die Oberfläche unter einem eigenen Ursprung aus, jede Anfrage an
|
|
// Home Assistant ist damit ursprungsübergreifend, und die WebView lehnt sie
|
|
// ohne CORS-Freigabe ab. Nativ gestellte Anfragen kennen keine
|
|
// CORS-Prüfung — die App braucht dadurch keinerlei CORS-Einstellung am
|
|
// Server. Die WebSocket-Verbindung läuft unberührt weiter.
|
|
CapacitorHttp: { enabled: true },
|
|
|
|
// Oberflächen-Updates ohne Xcode (siehe src/daten/ota.ts und
|
|
// ../VERSIONIERUNG.md). Das Bündel liegt in der Integration und wird
|
|
// über Home Assistant ausgeliefert — keine fremde Cloud beteiligt.
|
|
CapacitorUpdater: {
|
|
// Kein Selbstlauf: die App lädt nur, wenn der Benutzer den Knopf in den
|
|
// Einstellungen drückt. Ein Update, das ungefragt die Oberfläche
|
|
// austauscht, während jemand gerade eine Fahrt einträgt, wäre die
|
|
// schlechtere Sorte Hilfsbereitschaft.
|
|
autoUpdate: false,
|
|
|
|
// Kommt eine frisch signierte App über Xcode aufs Gerät, gilt wieder
|
|
// deren eingebautes Bündel — sonst liefe ein älteres OTA-Bündel weiter
|
|
// und überdeckte genau die native Änderung, für die Xcode nötig war.
|
|
resetWhenUpdate: true,
|
|
|
|
// Meldet sich die App nach einem Wechsel nicht binnen dieser Zeit als
|
|
// startklar (notifyAppReady in src/main.tsx), kehrt das Plugin von
|
|
// selbst zum vorherigen Bündel zurück. Das ist die Rückfallebene: ein
|
|
// kaputtes Bündel kann das Gerät nicht dauerhaft lahmlegen. Bewusst
|
|
// großzügiger als die 10 Sekunden Vorgabe — die Erstladung holt Profil,
|
|
// Fahrten und Tankvorgänge, und ein langsames Netz darf nicht wie ein
|
|
// defektes Bündel aussehen.
|
|
appReadyTimeout: 20000,
|
|
|
|
// Ein Bündel, das beim Start durchgefallen ist, wird nicht aufbewahrt.
|
|
autoDeleteFailed: true,
|
|
},
|
|
},
|
|
}
|
|
|
|
export default konfiguration
|