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