AnpherosAnpheros PlatformDevelopers

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

  1. Schalten Sie die HealthKit-Funktion in Xcode ein und fügen Sie NSHealthShareUsageDescription zu Info.plist hinzu (plus NSHealthUpdateUsageDescription, nur wenn Sie schreiben).
  2. 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.
  3. 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

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

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

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Product updates by email

New features, guides and the end of the beta. One email a month at most.

Send me occasional Anpheros Platform updates by email (new features, API changes, guides). I'll confirm by email and can unsubscribe in one click from any email. Privacy