diff --git a/CamperMonitor/Bluetooth/BluetoothManager.swift b/CamperMonitor/Bluetooth/BluetoothManager.swift index 657b331..0ec3b95 100644 --- a/CamperMonitor/Bluetooth/BluetoothManager.swift +++ b/CamperMonitor/Bluetooth/BluetoothManager.swift @@ -280,6 +280,10 @@ final class BluetoothManager: NSObject { bluetoothStatusText = "Demo-Modus" //fridgeStates[DemoData.fridge.id] = DemoData.fridgeState levelStates[DemoData.level.id] = DemoData.levelState + // Ohne "live" bleibt der Ausrichtungs-Assistent (und die Live + // Activity) im Demo-Modus deaktiviert, weil beide echte Messwerte + // voraussetzen. + linkStates[DemoData.level.id] = .live solarStates[DemoData.solar.id] = DemoData.solarState linkStates[DemoData.solar.id] = .live diff --git a/CamperMonitor/Store/DemoData.swift b/CamperMonitor/Store/DemoData.swift index a39807f..9af7bb8 100644 --- a/CamperMonitor/Store/DemoData.swift +++ b/CamperMonitor/Store/DemoData.swift @@ -3,18 +3,30 @@ import Foundation /// Füllt die App mit erfundenen Messwerten, damit sich die Ansichten ohne /// Fahrzeug und ohne Bluetooth prüfen lassen. /// -/// Nur in Debug-Builds und nur, wenn beim Start `CAMPER_DEMO=1` gesetzt ist: +/// Nur in Debug-Builds, auf zwei Wegen einzuschalten: /// -/// xcrun simctl launch --terminate-running-process \ -/// booted de.fritob.CamperMonitor -/// # mit: SIMCTL_CHILD_CAMPER_DEMO=1 davor +/// * Umgebungsvariable `CAMPER_DEMO=1` beim Start – praktisch im Simulator: +/// +/// xcrun simctl launch --terminate-running-process \ +/// booted de.fritob.CamperMonitor +/// # mit: SIMCTL_CHILD_CAMPER_DEMO=1 davor +/// +/// * Schalter in den Einstellungen (`SettingsView`) – der einzige Weg auf +/// einem lokal installierten Build ohne Xcode-Verbindung, da sich dort +/// keine Umgebungsvariable setzen lässt. Wirkt erst nach einem Neustart der +/// App, weil `DeviceStore` und `BluetoothManager` den Stand nur beim Start +/// lesen. /// /// Im normalen Betrieb wird hiervon nichts ausgeführt. enum DemoData { + /// Schlüssel für den Einstellungen-Schalter, siehe `SettingsView`. + static let enabledKey = "demoModeEnabled" + static var isEnabled: Bool { #if DEBUG - return ProcessInfo.processInfo.environment["CAMPER_DEMO"] == "1" + if ProcessInfo.processInfo.environment["CAMPER_DEMO"] == "1" { return true } + return UserDefaults.standard.bool(forKey: enabledKey) #else return false #endif diff --git a/CamperMonitor/Views/SettingsView.swift b/CamperMonitor/Views/SettingsView.swift index aeb5b44..055ac0a 100644 --- a/CamperMonitor/Views/SettingsView.swift +++ b/CamperMonitor/Views/SettingsView.swift @@ -4,12 +4,28 @@ import SwiftUI /// betrifft, steht bei diesem Gerät. struct SettingsView: View { @AppStorage(AppSettings.showDiagnosticsKey) private var showDiagnostics = false + #if DEBUG + @AppStorage(DemoData.enabledKey) private var demoModeEnabled = false + #endif @Environment(PhoneWatchLink.self) private var watch @Environment(\.dismiss) private var dismiss var body: some View { NavigationStack { List { + #if DEBUG + Section { + Toggle("Demo-Modus", isOn: $demoModeEnabled) + } header: { + Text("Entwicklung") + } footer: { + Text("Füllt die App mit erfundenen Fahrzeugen und Messwerten, um " + + "Ansichten ohne echte Sensoren zu prüfen. Wirkt erst nach " + + "einem Neustart der App – einmal beenden (im App-Umschalter " + + "nach oben wischen) und wieder öffnen.") + } + #endif + Section { Toggle("Diagnose anzeigen", isOn: $showDiagnostics) } header: {