AnpherosAnpheros PlatformDevelopers

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

Apple Health (HealthKit) та FHIR

Читайте дані Apple Watch та Apple Health через HealthKit на Swift, за місцевим днем, і записуйте їх до запису FHIR R4: дозволи, фонове синхронізацію, правила Apple.

Дані Apple Watch зберігаються в Apple Health на сполученому iPhone, і єдиний спосіб прочитати їх — це HealthKit, з програми на цьому iPhone, за дозволом особи. Щоб помістити їх у запис FHIR, читайте щоденну статистику за допомогою HKStatisticsCollectionQuery, надсилайте значення на ваш бекенд і записуйте кожну метрику як Observation з кодом LOINC та одиницею UCUM. Ця сторінка демонструє код Swift (перевірений за типом проти SDK iOS 17), дозволи та правила, встановлені Apple, а також те, як значення стають FHIR R4 Observations.

Що міститься в Apple Health

Apple Health збирає дані, які вимірюють iPhone та Apple Watch — пульс, пульс у стані спокою, варіабельність серцевого ритму (SDNN), кисень у крові, частоту дихання, кроки, енергію, стадії сну, сповіщення про нерегулярний ритм, записи ЕКГ — а також дані, які записують інші програми: Garmin Connect, Oura, Withings Health Mate, розумні ваги, монітори артеріального тиску, глюкометри. Таким чином, читання Apple Health охоплює більше, ніж лише Apple Watch.

Сервера HealthKit або веб-API не існує. Дані залишаються на пристрої (і в зашифрованому резервному копіюванні iCloud користувача); ваш додаток читає їх локально.

Дозволи

  1. Увімкніть можливість HealthKit в Xcode та додайте NSHealthShareUsageDescription до Info.plist (плюс NSHealthUpdateUsageDescription, тільки якщо ви пишете).
  2. Запитуйте типи, які вам потрібні. Люди можуть дозволити одні та відмовити в інших, а HealthKit не повідомляє вашому додатку, чи було відмовлено в доступі для читання: тип, у якому було відмовлено, просто повертає порожні дані. Розробляйте екрани для "порожніх даних", а не для помилок.
  3. Запитуйте в момент підключення людини, з реченням, що пояснює причину, а не під час першого запуску.

Читання щоденних значень у 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
}

Чому статистичні запити замість читання зразків: HKStatisticsCollectionQuery повертає підсумкові значення та середні показники за день, які Apple Health вже дедуплікував з різних джерел, тому кроки, підраховані як iPhone, так і Watch, не додаються двічі. Читання необроблених зразків та їх самостійне підсумовування є найпоширенішим джерелом завищених показників кроків.

Дні – це місцеві календарні дні особи (Calendar.current). Зберігайте їх у такому вигляді до запису FHIR, де effectivePeriod спостереження (Observation) – це місцевий день із його зміщенням часового поясу.

Підтримання актуальності запису

Від значень Swift до FHIR Observations

Надішліть масив DailyValue на ваш бекенд і запишіть один Observation для кожної особи, метрики та дня зі стабільним ідентифікатором, оновлюючи його, коли той самий день настане знову. Таблиця зіставлення (тип HealthKit → LOINC → UCUM), валідний JSON-приклад і TypeScript-код, який виконує це upsert, що запускається на платформі, знаходяться тут: Wearable data in FHIR. Коди для двох метрик тут:

HealthKit LOINC UCUM Значення за день
heartRate 8867-4 Heart rate /min середнє, з мінімумом і максимумом як компонентами
stepCount 41950-7 Number of steps in 24 hour {steps} загальна кількість

Правила Apple щодо даних про здоров'я

Apple Health Records

Окрім даних про фізичну активність, Apple Health може зберігати клінічні записи, завантажені з медичних закладів-учасників (переважно в Сполучених Штатах), а HealthKit надає їх як HKClinicalRecord об'єкти, що містять оригінальний FHIR ресурс. Для їх читання потрібен окремий дозвіл та право доступу. Це інша інтеграція, ніж дані з носимих пристроїв, і Anpheros Daily сьогодні їх не читає.

Де Anpheros вписується

Платформа Anpheros зберігає результат: запис FHIR R4 особи, де кожне значення з ношеного пристрою представлене як Observation, позначене як дані пристрою, згода для інших додатків, походження та журнал доступу. Вона не читає Apple Health безпосередньо — це відбувається у вашому iOS-додатку. Власний додаток Anpheros, Anpheros Daily, читає Apple Health на iPhone (плани Plus та Max) і записує щоденні підсумки до запису з наведеними вище кодами.

Часті запитання

Чи можу я читати дані Apple Watch із сервера?

Ні. Дані Apple Watch синхронізуються з Apple Health на парному iPhone, і HealthKit може використовуватися лише додатком на цьому пристрої. Додаток читає дані та надсилає їх на ваш сервер.

Чи існує веб-API або REST API для Apple Health?

Ні. Apple не пропонує веб-API або REST API для Apple Health: HealthKit працює лише всередині додатка на iPhone (або Apple Watch) користувача. Щоб використовувати дані на сервері, ваш додаток читає їх за дозволом користувача та надсилає, наприклад, як FHIR Observations до Anpheros.

Чи потрібен мені API-ключ або плата за Apple Health API?

Жодного ключа та жодної плати: HealthKit є частиною iOS. Вам потрібна можливість HealthKit у вашому додатку, опис використання для кожного типу даних та дозвіл користувача; перевірка App Store перевіряє, як ви використовуєте дані.

Як дізнатися, чи відмовив користувач у доступі до типу HealthKit?

Ви не можете, для доступу на читання: HealthKit приховує це для захисту конфіденційності, а відхилений тип не повертає жодних даних. Розглядайте "відсутність даних" як нормальний стан і запропонуйте спосіб переглянути дозволи в додатку Health.

Чому кількість моїх кроків вища, ніж у додатку Health?

Ймовірно, ви сумуєте необроблені зразки з кількох джерел (iPhone та Watch). Використовуйте HKStatisticsCollectionQuery з .cumulativeSum, що застосовує власне дедуплікацію Apple Health.

Який код LOINC відповідає варіабельності серцевого ритму Apple Watch?

Apple Health зберігає HRV як SDNN, що відповідає LOINC 80404-7. Health Connect зберігає RMSSD, іншу статистику, тому не змішуйте їх під одним кодом.

Пов'язане

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