App-Architektur
Technische Architektur der HyponaTrack-App
Zweck: Multimodales Home-Monitoring nach transsphenoidaler Hypophysenchirurgie zur Frühwarnung einer verzögerten postoperativen Hyponaträmie (DPH).
Systemübersicht
Die HyponaTrack-App ist als native iOS-Anwendung (SwiftUI, iOS 18.0+) mit MVVM-Architektur und Service Layer implementiert. Die App gliedert sich in fünf Hauptbereiche: Dashboard (Ampel), Erfassung (Eingabe), Trends (Charts), Alarme (Push) und Export (CSV/PDF/REDCap-Sync).
Technologie-Stack
| Komponente | Technologie | Begründung |
|---|---|---|
| UI Framework | SwiftUI (iOS 18+) | Deklarativ, Charts-Framework nativ |
| Persistenz | SwiftData | Nativer Swift-Stack, kein CoreData-Boilerplate |
| Gesundheitsdaten | HealthKit | Gewicht, Aktivität, HRV, Schlaf, Wasser |
| Charts | Swift Charts | Nativ, performant, für Trend-Darstellung |
| Notifications | UserNotifications | Lokale Erinnerungen + Eskalations-Alerts |
| Care Plan | CareKit + CareKitStore | Care Plan Management, Aufgabenplanung |
| Consent | ResearchKit | Einwilligungsflow gemäß Studienprotokoll |
| Studien-EDC | REDCap REST API | Automatischer Datensync zur Studien-EDC |
| Lock-Screen Widget | Live Activity / ActivityKit | Monitoring-Widget auf dem Sperrbildschirm |
| Watch Companion | WatchConnectivity | Apple Watch Companion-App |
| Architektur | MVVM + Service Layer | Standard für SwiftUI, testbar |
| Minimum Target | iOS 18.0 | SwiftData + ActivityKit Voraussetzung |
Datenmodell
PatientProfile (SwiftData)
Zentrale Patientenstammdaten inkl. aller Risikofaktoren (Kat. A/B/C): surgeryDate, age, sex, bmi, baselineWeight, studyID (Pseudonym, z. B. „UKE-2026-0042”), risikoMedikamenteCSV (kommagetrennte Enum-Werte), isLoanDevice, baselineIsPraeOp, isSimplifiedMode (vereinfachter Modus, von Study Nurse aktivierbar).
Berechnete Eigenschaften: isKatBPending (Intra-OP-Daten fehlen noch), isMonitoringActive (Monitoring läuft), currentPostOpDay (aktueller POD). buildRiskProfile() → RiskProfile für Algorithmus. buildBaseline() → PatientBaseline für Trend-Analyse.
DailyEntry (SwiftData)
Ein Eintrag pro Tag (POD), enthält alle Messwerte: Gewicht (morgens/abends), Fluid, Urin-SG, Symptom-Referenzen, HealthKit-Daten (Steps, HRV, Sleep, HR), Alert-Level + Reasons, isMorningCheckComplete, isEveningCheckComplete.
SymptomEntry (SwiftData)
6-Item-Score: Übelkeit, Kopfschmerz, Müdigkeit, Verwirrtheit, Muskelkrämpfe, Wohlbefinden-VAS.
Scoring: totalScore = nausea x 3 + headache x 3 + fatigue x 2 + confusion x 4 + muscleCramps x 2 + max(0, 10 − VAS)
AlertLevel (Ampel)
Drei Stufen: green (Routine-Monitoring fortführen), yellow (Telefonische Rückmeldung Ambulanz), red (Sofortige Vorstellung NA/Ambulanz).
Services und Module
Eskalations-Engine (Kernalgorithmus)
Der Kern-Algorithmus in EscalationEngine.swift: EscalationEngine.evaluate(entry:profile:) → EvaluationResult(level, reasons).
Ablauf: (1) PatientProfile.buildRiskProfile() → Risiko-Score → Risikoklasse. (2) AlertThresholds.forRiskClass(_, pod:) → angepasste Schwellenwerte. (3) PatientProfile.buildBaseline() → Baseline-Werte. (4) DailyEntry → DailySnapshot (Mapping). (5) AlertEngine.evaluate(snapshot:thresholds:) → Level + Trigger-Gründe. (6) Ergebnis wird in DailyEntry.alertLevel und .alertReasons gespeichert.
Bei hohem Risiko werden Gelb/Rot-Schwellen um ~20 % gesenkt.
Adaptive Erinnerungen (AdaptiveReminderService)
Der AdaptiveReminderService berechnet einmal täglich die Erinnerungsintensität (minimal / normal / erhöht / maximal) basierend auf der 3-Tage-Adhärenz, der POD-Phase und dem heutigen Morgen-Check-Status. Die Intensität bestimmt, welche Benachrichtigungen über den NotificationService geplant werden — von nur Morgen-/Abend-Check (minimal) bis hin zu task-spezifischen Erinnerungen mit Nachmittags-Nachhol-Reminder (maximal). Im kritischen Fenster (POD 5–9) wird die Intensität automatisch auf mindestens „erhöht” gesetzt.
Vereinfachter Modus (isSimplifiedMode)
Von der Study Nurse beim Onboarding oder in den Einstellungen aktivierbar. Reduziert die Tab-Leiste auf Dashboard + Kontakte, blendet kognitive Tests (Reaktionszeit, Feinmotorik, Trail Making) aus der Aufgabenliste aus, entfernt Sync-Status und Kat-B-Hinweise vom Dashboard. Die adaptiven Erinnerungen berücksichtigen den Modus und versenden keine Reminder für ausgeblendete Tasks.
REDCap-Integration
REDCapService (Actor)
Actor-basierter Auto-Sync mit Offline-Queue: configure(serverURL:token:) mit HTTPS-Pflicht, autoSync(entry:profile:) nach jeder Eingabe, exportAll(profile:entries:) für manuellen Vollexport, retryPendingIfNeeded() für Offline-Queue.
Sicherheit: API-Token im Keychain (nicht UserDefaults). HTTPS wird erzwungen. Offline-Queue: Fehlgeschlagene Requests werden gespeichert und bei nächster Verbindung nachgesendet.
Datenmapping: Baseline → patient_baseline Instrument. Tageseinträge → daily_monitoring Repeating Instrument (Instance = POD).
HealthKit-Integration
| Typ | Richtung | Verwendung |
|---|---|---|
| Schritte | Lesen | Aktivitäts-Trend |
| Ruheherzfrequenz | Lesen | Kontext |
| HRV (SDNN) | Lesen | Kontext |
| Schlafdauer | Lesen | Kontext |
| Gewicht | Lesen + Schreiben | Automatischer Import von WLAN-Waagen |
| Wasser | Schreiben | Manuelle Eingabe → HealthKit |
HealthKit-Datentypen und Verwendung in HyponaTrack.
Background Delivery: Gewicht und Schritte werden im Hintergrund aktualisiert.
CareKit-Integration
CareKitStoreManager erstellt den Pflegeplan mit 7–9 OCKTasks (Gewicht, Symptome, Fluid, Urin-SG, Kognition, Tapping, optional Desmopressin). Schedules basieren auf dem OP-Datum und laufen 14 Tage.
Sicherheit
| Maßnahme | Implementierung |
|---|---|
| PIN-Hashing | SHA-256 + Salt (CryptoKit) in KeychainService |
| Biometrische Auth | Face ID → Passcode Fallback (AppLockManager) |
| Token-Speicherung | Keychain (kSecAttrAccessibleWhenUnlockedThisDeviceOnly) |
HTTPS-Pflicht |
Erzwungen in REDCapService.configure() und .post() |
| Kein Passcode | App bleibt gesperrt (Simulator ausgenommen) |
| Datenlokalität | SwiftData lokal, kein Cloud-Backend |