# Apple Health (HealthKit) FHIR-re

> Olvassa be az Apple Watch és az Apple Health adatait a HealthKit segítségével Swiftben, helyi naponta, és írja be őket egy FHIR R4 rekordba: engedélyek, háttérszinkronizálás, Apple szabályai.

Source: https://developers.anpheros.com/hu/guides/apple-health-fhir

**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

```swift
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

- **Megnyitáskor:** minden alkalommal, amikor az alkalmazás előtérbe kerül, olvassa el az utolsó sikeres szinkronizálás óta eltelt napokat. Ez a megbízható alap.
- **Háttérben:** `HKObserverQuery` a `enableBackgroundDelivery(for:frequency:)` segítségével felébreszti az alkalmazást, amikor új adatok érkeznek; ehhez szükséges a HealthKit háttérszállítási jogosultság, és az iOS dönti el a tényleges időzítést.
- **Első csatlakozás:** importáljon korlátozott előzményeket (például 30 napot) ahelyett, hogy éveket, majd haladjon tovább.

## 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](https://developers.anpheros.com/hu/guides/wearable-data-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

- App Review Guideline 5.1.3: az egészségügyi adatok nem használhatók fel reklámozásra vagy adatbányászatra, nem oszthatók meg harmadik felekkel a személy beleegyezése nélkül, és a személyes egészségügyi információk nem tárolhatók az iCloud-ban.
- Az adatvédelmi irányelveidnek tartalmaznia kell, hogy mit olvasol és miért; az Apple ellenőrzi.
- Az alkalmazásod által az Apple Health-be írt adatok az alkalmazásodhoz lesznek rendelve; az általad olvasott adatok megőrzik eredeti forrásukat (`HKSource`), amelyet forrásrendszerként kell bevezetned a rekordba.

## 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ó

- [Viselhető eszközök adatai FHIR formátumban](https://developers.anpheros.com/hu/guides/wearable-data-fhir): a megfeleltetési táblázat és a backend kód
- [Health Connect FHIR-re](https://developers.anpheros.com/hu/guides/health-connect-fhir): ugyanaz Androidon
- [Személyes egészségügyi nyilvántartási alkalmazás készítése](https://developers.anpheros.com/hu/guides/personal-health-record-app)
- [Egészségügyi alkalmazás készítése Flutterrel](https://developers.anpheros.com/guides/healthcare-app-flutter)
