AnpherosAnpheros PlatformDevelopers

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

Apple Health (HealthKit) FHIR-re

Apple Watch és Apple Health adatok olvasása HealthKit segítségével Swiftben, helyi napok szerint, és írás FHIR R4 rekordba: engedélyek, háttérszinkronizálás, Apple szabályai.

Az Apple Watch adatai az Apple Health-ben élnek a párosított iPhone-on, és az egyetlen módja az olvasásuknak a HealthKit, az iPhone-on futó alkalmazásból, a személy engedélyével. A FHIR rekordba való beillesztéshez olvassa be a napi statisztikákat a HKStatisticsCollectionQuery segítségével, küldje el az értékeket a backendjére, és írja be minden mértéket egy Observation-ként LOINC kóddal és UCUM egységgel. Ez az oldal bemutatja a Swift kódot (típusellenőrzött az iOS 17 SDK ellenében), az Apple által beállított engedélyeket és szabályokat, valamint azt, hogyan válnak az értékek FHIR R4 Observation-ökké.

Mi van az Apple Healthben

Az Apple Health összegyűjti az iPhone és az Apple Watch által mért adatokat — pulzusszám, nyugalmi pulzusszám, szívritmusvariabilitás (SDNN), vér oxigénszintje, légzési ráta, lépések, energia, alvási fázisok, szabálytalan ritmus értesítések, EKG felvételek — és azokat az adatokat is, amelyeket más alkalmazások írnak: Garmin Connect, Oura, Withings Health Mate, okos mérlegek, vérnyomásmérők, glükózmérők. Ezért az Apple Health olvasása többet fed le, mint az Apple Watch.

Nincs HealthKit szerver vagy web API. Az adatok az eszközön maradnak (és a személy titkosított iCloud biztonsági mentésében); az Ön alkalmazása helyileg olvassa azokat.

Engedélyek

  1. Kapcsolja be a HealthKit képességet az Xcode-ban, és adja hozzá a NSHealthShareUsageDescription-at a Info.plist-hez (plusz a NSHealthUpdateUsageDescription-öt, ha ír).
  2. Kérje el az igényelt típusokat. A felhasználók engedélyezhetnek néhányat, és megtagadhatnak másokat, és a HealthKit nem tájékoztatja az alkalmazást arról, hogy az olvasási hozzáférést megtagadták-e: a megtagadott típus egyszerűen nem ad vissza adatot. Tervezze meg a "nincs adat" állapotra a képernyőket, nem pedig hibaüzenetre.
  3. Kérdezzen rá abban a pillanatban, amikor a felhasználó csatlakozik, egy mondattal magyarázva, hogy miért, ne az első indításkor.

Napi értékek olvasása Swiftben

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
}

Miért statisztikai lekérdezések a minták olvasása helyett: A HKStatisticsCollectionQuery napi összesítéseket és átlagokat ad vissza, amelyeket az Apple Health már de-duplikált a források között, így az iPhone és az Apple Watch által számolt lépések nem adódnak össze kétszer. A nyers minták olvasása és azok saját magad általi összeadása a leggyakoribb oka a felfújt lépésszámlálásnak.

A napok a személy helyi naptári napjai (Calendar.current). Tartsd meg őket így egészen a FHIR rekordig, ahol az Observation effectivePeriod-a az a helyi nap az időzóna-eltolódásával.

A rekord naprakészen tartása

Swift értékekből FHIR megfigyelésekbe

Küldje el a DailyValue tömböt a backendjére, és írjon egy megfigyelést (Observation) személyenként, mérőszámonként és naponként, stabil azonosítóval, frissítve azt, amikor ugyanaz a nap ismét eljön. A megfeleltetési táblázat (HealthKit típus → LOINC → UCUM), egy validált JSON példa és a TypeScript kód, amely ezt az upsert műveletet végzi a platformon, a Wearable data in FHIR oldalon található. Az itt szereplő két mérőszám kódjai a következők:

HealthKit LOINC UCUM Érték naponta
heartRate 8867-4 Heart rate /min átlag, minimummal és maximummal mint komponensekkel
stepCount 41950-7 Number of steps in 24 hour {steps} összesen

Az Apple szabályai az egészségügyi adatokra vonatkozóan

Apple Health Records

A különálló fitneszadatoktól eltérően az Apple Health képes tárolni a részt vevő egészségügyi rendszerekből (főként az Egyesült Államokban) letöltött klinikai rekordokat, és a HealthKit ezeket HKClinicalRecord objektumokként teszi elérhetővé, amelyek az eredeti FHIR erőforrást tartalmazzák. Olvasásukhoz külön engedélyre és jogosultságra van szükség. Ez egy másfajta integráció, mint a viselhető eszközökből származó adatok, és az Anpheros Daily jelenleg nem olvassa ezeket.

Hol illeszkedik be az Anpheros

Az Anpheros Platform tárolja az eredményt: a személy FHIR R4 rekordját, ahol minden viselhető eszköz értéke egy Observationként van jelölve, mint eszközadat, hozzájárulás más alkalmazásokhoz, származási információ és hozzáférési napló. Nem olvassa az Apple Health-et maga – ez az Ön iOS alkalmazásában történik. Az Anpheros saját alkalmazása, az Anpheros Daily, olvassa az Apple Health-et iPhone-on (Plus és Max csomagok), és napi összefoglalókat ír a rekordba a fenti kódokkal.

Gyakran ismételt kérdések

Olvashatok Apple Watch adatokat szerverről?

Nem. Az Apple Watch adatok szinkronizálódnak az Apple Health-be a párosított iPhone-on, és a HealthKit csak azon a készüléken futó alkalmazás használhatja. Az alkalmazás elolvassa az adatokat, és elküldi a szerverére.

Van Apple Health web API vagy REST API?

Nem. Az Apple nem kínál webes vagy REST API-t az Apple Health-hez: a HealthKit csak egy alkalmazáson belül fut az illető iPhone-ján (vagy Apple Watch-án). Az adatok szerveren történő használatához az alkalmazás az illető engedélyével elolvassa azokat, és elküldi, például FHIR Observations formátumban az Anpheros-nak.

Szükségem van API kulcsra, vagy fizetnem kell az Apple Health API-ért?

Nincs kulcs és nincs díj: a HealthKit az iOS része. Szüksége van a HealthKit képességre az alkalmazásában, használati leírásra minden adat típushoz, és az illető engedélyére; az App Store felülvizsgálata ellenőrzi, hogyan használja az adatokat.

Honnan tudom, hogy az illető megtagadta a hozzáférést egy HealthKit típushoz?

Nem tudja, az olvasási hozzáféréshez: a HealthKit elrejti azt a magánélet védelme érdekében, és a megtagadott típus nem ad vissza adatot. Kezelje a "nincs adat" állapotot normál állapotként, és kínáljon lehetőséget az engedélyek áttekintésére a Health alkalmazásban.

Miért magasabbak a lépésszámaim, mint a Health alkalmazásban?

Valószínűleg több forrásból (iPhone és Watch) származó nyers mintákat összegez. Használja a HKStatisticsCollectionQuery-at a .cumulativeSum-el, amely az Apple Health saját deduplikációját alkalmazza.

Melyik LOINC kód az Apple Watch szívritmus-variabilitása?

Az Apple Health a HRV-t SDNN-ként tárolja, ami megfelel a LOINC 80404-7-nek. A Health Connect RMSSD-t tárol, ami egy másik statisztika, ezért ne keverje össze a kettőt egy kód alatt.

Kapcsolódó

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