Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Apple Health (HealthKit) zu FHIR
Apple Watch und Apple Health Daten mit HealthKit in Swift pro lokalem Tag lesen und in einen FHIR R4 Datensatz schreiben: Berechtigungen, Hintergrund-Synchronisierung, Apple-Regeln.
Apple Watch Daten leben in Apple Health auf dem gekoppelten iPhone, und der einzige Weg, sie zu lesen, ist HealthKit, von einer App auf diesem iPhone, mit der Erlaubnis der Person. Um sie in einen FHIR Datensatz zu übertragen, lesen Sie tägliche Statistiken mit HKStatisticsCollectionQuery, senden Sie die Werte an Ihr Backend und schreiben Sie jede Metrik als Observation mit einem LOINC-Code und einer UCUM-Einheit. Diese Seite zeigt den Swift-Code (typsicher gegen das iOS 17 SDK), die von Apple festgelegten Berechtigungen und Regeln und wie die Werte zu FHIR R4 Observations werden.
Was ist in Apple Health enthalten
Apple Health sammelt, was das iPhone und die Apple Watch messen – Herzfrequenz, Ruheherzfrequenz, Herzfrequenzvariabilität (SDNN), Blutsauerstoff, Atemfrequenz, Schritte, Energie, Schlafphasen, Benachrichtigungen bei unregelmäßigem Herzschlag, EKG-Aufzeichnungen – und was andere Apps schreiben: Garmin Connect, Oura, Withings Health Mate, intelligente Waagen, Blutdruckmessgeräte, Glukosemessgeräte. Das Lesen von Apple Health deckt daher mehr als nur die Apple Watch ab.
Es gibt keinen HealthKit-Server oder eine Web-API. Daten bleiben auf dem Gerät (und im verschlüsselten iCloud-Backup der Person); Ihre App liest sie lokal.
Berechtigungen
- Schalten Sie die HealthKit-Funktion in Xcode ein und fügen Sie
NSHealthShareUsageDescriptionzuInfo.plisthinzu (plusNSHealthUpdateUsageDescription, nur wenn Sie schreiben). - Fordern Sie die benötigten Typen an. Personen können einige zulassen und andere ablehnen. HealthKit teilt Ihrer App nicht mit, ob der Lesezugriff verweigert wurde: Ein verweigerter Typ gibt einfach keine Daten zurück. Gestalten Sie die Bildschirme für "keine Daten" und nicht für einen Fehler.
- Fordern Sie die Berechtigung zum Zeitpunkt der Verbindung der Person an, mit einem erklärenden Satz, warum, und nicht beim ersten Start.
Tägliche Werte in Swift lesen
import Foundation
import HealthKit
/// One day of Apple Health data, ready to send to your backend.
struct DailyValue: Codable {
let metric: String // "heart_rate", "steps"
let day: String // "2026-10-01", the user's local day
let value: Double
let min: Double?
let max: Double?
}
let store = HKHealthStore()
let heartRate = HKQuantityType(.heartRate)
let steps = HKQuantityType(.stepCount)
func requestAccess() async throws {
// Read-only: the app never writes to Apple Health.
try await store.requestAuthorization(toShare: [], read: [heartRate, steps])
}
/// Daily statistics for the last `days` days, one value per local calendar day.
func dailyValues(_ type: HKQuantityType, metric: String, unit: HKUnit,
options: HKStatisticsOptions, days: Int) async throws -> [DailyValue] {
let calendar = Calendar.current
let end = calendar.startOfDay(for: Date()).addingTimeInterval(86_400)
let start = calendar.date(byAdding: .day, value: -days, to: end)!
let query = HKStatisticsCollectionQueryDescriptor(
predicate: HKSamplePredicate.quantitySample(type: type,
predicate: HKQuery.predicateForSamples(withStart: start, end: end)),
options: options,
anchorDate: start,
intervalComponents: DateComponents(day: 1))
let collection = try await query.result(for: store)
let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd"
var out: [DailyValue] = []
collection.enumerateStatistics(from: start, to: end) { stats, _ in
let day = fmt.string(from: stats.startDate)
if options.contains(.cumulativeSum), let sum = stats.sumQuantity() {
out.append(DailyValue(metric: metric, day: day, value: sum.doubleValue(for: unit), min: nil, max: nil))
} else if let avg = stats.averageQuantity() {
out.append(DailyValue(metric: metric, day: day, value: avg.doubleValue(for: unit),
min: stats.minimumQuantity()?.doubleValue(for: unit),
max: stats.maximumQuantity()?.doubleValue(for: unit)))
}
}
return out
}
func collect() async throws -> [DailyValue] {
try await requestAccess()
let bpm = HKUnit.count().unitDivided(by: .minute())
let hr = try await dailyValues(heartRate, metric: "heart_rate", unit: bpm,
options: [.discreteAverage, .discreteMin, .discreteMax], days: 30)
let st = try await dailyValues(steps, metric: "steps", unit: .count(), options: .cumulativeSum, days: 30)
return hr + st // POST these to your backend, which writes them to the FHIR record
}
Warum Statistikabfragen statt Rohdaten lesen: HKStatisticsCollectionQuery gibt Tagesgesamtsummen und -durchschnitte zurück, die Apple Health bereits quellübergreifend dedupliziert hat, sodass Schritte, die sowohl vom iPhone als auch von der Watch gezählt wurden, nicht doppelt addiert werden. Das Lesen von Rohdaten und deren eigene Summierung ist die häufigste Ursache für überhöhte Schrittzahlen.
Die Tage sind die lokalen Kalendertage der Person (Calendar.current). Behalten Sie diese bis zum FHIR-Datensatz bei, wobei der effectivePeriod der Observation dieser lokale Tag mit seinem Zeitzonen-Offset ist.
Den Datensatz aktuell halten
- Beim Öffnen: Lesen Sie die Tage seit der letzten erfolgreichen Synchronisierung jedes Mal, wenn die App in den Vordergrund tritt. Dies ist die zuverlässige Basis.
- Im Hintergrund:
HKObserverQuerymitenableBackgroundDelivery(for:frequency:)weckt Ihre App, wenn neue Daten eintreffen; dies erfordert die HealthKit-Berechtigung für die Hintergrundlieferung, und iOS entscheidet über den tatsächlichen Zeitpunkt. - Erste Verbindung: Importieren Sie eine begrenzte Historie (z. B. 30 Tage) anstatt Jahre, und arbeiten Sie sich dann vorwärts.
Von Swift-Werten zu FHIR Observations
Senden Sie das DailyValue-Array an Ihr Backend und schreiben Sie eine Observation pro Person, Metrik und Tag mit einer stabilen Kennung, die aktualisiert wird, wenn derselbe Tag erneut auftritt. Die Zuordnungstabelle (HealthKit-Typ → LOINC → UCUM), ein validiertes JSON-Beispiel und der TypeScript-Code, der dieses Upsert durchführt und auf der Plattform ausgeführt wird, finden Sie unter Wearable data in FHIR. Die Codes für die beiden Metriken hier sind:
| HealthKit | LOINC | UCUM | Wert pro Tag |
|---|---|---|---|
heartRate |
8867-4 Heart rate | /min |
Durchschnitt, mit Minimum und Maximum als Komponenten |
stepCount |
41950-7 Number of steps in 24 hour | {steps} |
Gesamt |
Apples Regeln für Gesundheitsdaten
- App Review Guideline 5.1.3: Gesundheitsdaten dürfen nicht für Werbung oder Data Mining verwendet werden, dürfen nicht ohne Zustimmung der Person an Dritte weitergegeben werden und persönliche Gesundheitsinformationen dürfen nicht in iCloud gespeichert werden.
- Ihre Datenschutzerklärung muss darlegen, was Sie lesen und warum; Apple prüft dies.
- Daten, die Ihre App in Apple Health schreibt, werden Ihrer App zugeordnet; Daten, die Sie lesen, behalten ihre ursprüngliche Quelle (
HKSource), die Sie als Quellsystem in den Datensatz übernehmen sollten.
Apple Health Records
Getrennt von Fitnessdaten kann Apple Health klinische Aufzeichnungen enthalten, die von teilnehmenden Gesundheitssystemen (hauptsächlich in den Vereinigten Staaten) heruntergeladen wurden. HealthKit stellt diese als HKClinicalRecord Objekte bereit, die die ursprüngliche FHIR-Ressource enthalten. Das Lesen dieser Daten erfordert eine eigene Berechtigung und ein eigenes Entitlement. Dies ist eine andere Integration als bei Wearable-Daten, und Anpheros Daily liest diese Daten derzeit nicht.
Wo Anpheros passt
Die Anpheros Platform speichert das Ergebnis: den FHIR R4 Datensatz der Person, wobei jeder Wearable-Wert als Observation mit der Kennzeichnung Gerätedaten, Zustimmung für andere Apps, Herkunftsnachweis und einem Zugriffsprotokoll gespeichert wird. Sie liest Apple Health nicht selbst – das geschieht in Ihrer iOS-App. Anpheros' eigene App, Anpheros Daily, liest Apple Health auf dem iPhone (Plus und Max Pläne) und schreibt tägliche Zusammenfassungen in den Datensatz mit den oben genannten Codes.
Häufig gestellte Fragen
Kann ich Apple Watch-Daten von einem Server lesen?
Nein. Apple Watch-Daten werden mit Apple Health auf dem gekoppelten iPhone synchronisiert, und HealthKit kann nur von einer App auf diesem Gerät verwendet werden. Die App liest die Daten und sendet sie an Ihren Server.
Gibt es eine Apple Health Web API oder REST API?
Nein. Apple bietet keine Web- oder REST-API für Apple Health: HealthKit läuft nur innerhalb einer App auf dem iPhone (oder der Apple Watch) der Person. Um die Daten auf einem Server zu verwenden, liest Ihre App sie mit der Erlaubnis der Person und sendet sie, z. B. als FHIR Observations an Anpheros.
Benötige ich einen API-Schlüssel oder muss ich für die Apple Health API bezahlen?
Kein Schlüssel und keine Gebühr: HealthKit ist Teil von iOS. Sie benötigen die HealthKit-Funktion in Ihrer App, eine Nutzungsbeschreibung für jeden Datentyp und die Erlaubnis der Person; die App Store-Überprüfung prüft, wie Sie die Daten verwenden.
Woher weiß ich, ob die Person den Zugriff auf einen HealthKit-Typ verweigert hat?
Das können Sie nicht, für Lesezugriff: HealthKit verbirgt dies zum Schutz der Privatsphäre, und ein verweigerter Typ gibt keine Daten zurück. Behandeln Sie "keine Daten" als normalen Zustand und bieten Sie eine Möglichkeit, die Berechtigungen in der Health-App zu überprüfen.
Warum sind meine Schrittzählungen höher als in der Health-App?
Sie summieren wahrscheinlich Rohdaten aus mehreren Quellen (iPhone und Watch). Verwenden Sie HKStatisticsCollectionQuery mit .cumulativeSum, was die eigene Deduplizierung von Apple Health anwendet.
Welcher LOINC-Code ist die Herzfrequenzvariabilität der Apple Watch?
Apple Health speichert HRV als SDNN, was LOINC 80404-7 entspricht. Health Connect speichert RMSSD, eine andere Statistik, also mischen Sie die beiden nicht unter einem Code.
Verwandte Themen
- Wearable-Daten in FHIR: Die Mapping-Tabelle und der Backend-Code
- Health Connect zu FHIR: Dasselbe unter Android
- Erstellen einer persönlichen Gesundheitsakte-App
- Erstellen einer Gesundheits-App mit Flutter
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card