Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Apple Health (HealthKit) în FHIR
Citește datele Apple Watch și Apple Health cu HealthKit în Swift, pe zi locală, și scrie-le într-un fișier FHIR R4: permisiuni, sincronizare în fundal, reguli Apple.
Datele Apple Watch se află în Apple Health pe iPhone-ul asociat, iar singura modalitate de a le citi este prin HealthKit, dintr-o aplicație de pe acel iPhone, cu permisiunea persoanei. Pentru a le introduce într-un record FHIR, citiți statisticile zilnice cu HKStatisticsCollectionQuery, trimiteți valorile către backend-ul dvs. și scrieți fiecare metrică ca o Observație (Observation) cu un cod LOINC și o unitate UCUM. Această pagină prezintă codul Swift (verificat tipologic împotriva SDK-ului iOS 17), permisiunile și regulile stabilite de Apple, și cum valorile devin Observații FHIR R4.
Ce conține Apple Health
Apple Health colectează ceea ce iPhone-ul și Apple Watch măsoară — ritmul cardiac, ritmul cardiac de repaus, variabilitatea ritmului cardiac (SDNN), oxigenul din sânge, rata respiratorie, pașii, energia, stadiile somnului, notificările de ritm neregulat, înregistrările EKG — și ceea ce alte aplicații scriu: Garmin Connect, Oura, Withings Health Mate, cântare inteligente, tensiometre, glucometre. Prin urmare, citirea Apple Health acoperă mai mult decât Apple Watch.
Nu există un server HealthKit sau o API web. Datele rămân pe dispozitiv (și în backup-ul criptat iCloud al persoanei); aplicația dvs. le citește local.
Permisiuni
- Activați capabilitatea HealthKit în Xcode și adăugați
NSHealthShareUsageDescriptionlaInfo.plist(plusNSHealthUpdateUsageDescriptiondoar dacă scrieți). - Solicitați tipurile de date de care aveți nevoie. Persoanele pot permite unele și refuza altele, iar HealthKit nu informează aplicația dvs. dacă accesul la citire a fost refuzat: un tip de date refuzat pur și simplu nu returnează nicio informație. Proiectați ecranele pentru "fără date" mai degrabă decât pentru o eroare.
- Solicitați în momentul în care persoana se conectează, cu o propoziție care explică motivul, nu la prima lansare.
Citirea valorilor zilnice în 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
}
De ce interogări statistice în loc de citirea eșantioanelor: HKStatisticsCollectionQuery returnează totaluri și medii pe zi pe care Apple Health le-a deja de-duplicat între surse, astfel încât pașii numărați atât de iPhone, cât și de Watch nu sunt adăugați de două ori. Citirea eșantioanelor brute și însumarea lor de către dvs. este cea mai frecventă sursă de numărări exagerate ale pașilor.
Zilele sunt zilele calendaristice locale ale persoanei (Calendar.current). Păstrați-le așa până la înregistrarea FHIR, unde effectivePeriod al Observation este acea zi locală cu offset-ul său de fus orar.
Menținerea registrului la zi
- La deschidere: citiți zilele scurse de la ultima sincronizare reușită de fiecare dată când aplicația ajunge în prim-plan. Acesta este punctul de referință fiabil.
- În fundal:
HKObserverQuerycuenableBackgroundDelivery(for:frequency:)trezesc aplicația dvs. atunci când sosesc date noi; aceasta necesită dreptul de livrare în fundal HealthKit, iar iOS decide momentul exact. - Prima conexiune: importați un istoric limitat (de exemplu, 30 de zile) în loc de ani, apoi avansați.
De la valori Swift la Observații FHIR
Trimiteți array-ul DailyValue către backend-ul dvs. și scrieți câte o Observație pentru fiecare persoană, metrică și zi, cu un identificator stabil, actualizând-o atunci când vine din nou aceeași zi. Tabelul de mapare (tip HealthKit → LOINC → UCUM), un exemplu JSON validat și codul TypeScript care realizează acest upsert, rulat pe platformă, se găsesc în Wearable data in FHIR. Codurile pentru cele două metrice aici sunt:
| HealthKit | LOINC | UCUM | Valoare pe zi |
|---|---|---|---|
heartRate |
8867-4 Heart rate | /min |
medie, cu minim și maxim ca și componente |
stepCount |
41950-7 Number of steps in 24 hour | {steps} |
total |
Regulile Apple pentru datele de sănătate
- Ghidul de revizuire a aplicațiilor 5.1.3: datele de sănătate nu pot fi utilizate pentru publicitate sau exploatare de date, nu pot fi partajate cu terți fără consimțământul persoanei, iar informațiile personale de sănătate nu pot fi stocate în iCloud.
- Politica dvs. de confidențialitate trebuie să precizeze ce citiți și de ce; Apple verifică.
- Datele scrise de aplicația dvs. în Apple Health sunt atribuite aplicației dvs.; datele pe care le citiți își păstrează sursa originală (
HKSource), pe care ar trebui să o includeți în înregistrare ca sistem sursă.
Apple Health Records
Separat de datele de fitness, Apple Health poate stoca înregistrări clinice descărcate de la sisteme de sănătate participante (în principal în Statele Unite), iar HealthKit le expune ca obiecte HKClinicalRecord care poartă resursa FHIR originală. Citirea lor necesită permisiuni și drepturi de acces proprii. Acestea reprezintă o integrare diferită față de datele de la dispozitivele purtabile, iar Anpheros Daily nu le citește în prezent.
Unde se încadrează Anpheros
Platforma Anpheros stochează rezultatul: înregistrarea FHIR R4 a persoanei, cu fiecare valoare de la dispozitivul purtabil ca o Observație marcată ca date de dispozitiv, consimțământ pentru alte aplicații, proveniență și un jurnal de acces. Nu citește Apple Health în sine — acest lucru se întâmplă în aplicația dvs. iOS. Aplicația proprie Anpheros, Anpheros Daily, citește Apple Health pe iPhone (planurile Plus și Max) și scrie rezumate zilnice în înregistrare cu codurile de mai sus.
Întrebări frecvente
Pot citi date de pe Apple Watch de pe un server?
Nu. Datele de pe Apple Watch sunt sincronizate cu Apple Health pe iPhone-ul asociat, iar HealthKit poate fi utilizat doar de o aplicație de pe acel dispozitiv. Aplicația citește datele și le trimite pe serverul dumneavoastră.
Există o API web sau REST pentru Apple Health?
Nu. Apple nu oferă o API web sau REST pentru Apple Health: HealthKit rulează doar în interiorul unei aplicații de pe iPhone-ul (sau Apple Watch-ul) persoanei. Pentru a utiliza datele pe un server, aplicația dumneavoastră le citește cu permisiunea persoanei și le trimite, de exemplu, ca FHIR Observations către Anpheros.
Am nevoie de o cheie API sau să plătesc pentru API-ul Apple Health?
Nicio cheie și nicio taxă: HealthKit face parte din iOS. Aveți nevoie de capabilitatea HealthKit în aplicația dumneavoastră, o descriere a utilizării pentru fiecare tip de date și permisiunea persoanei; revizuirea App Store verifică modul în care utilizați datele.
Cum știu dacă persoana a refuzat accesul la un tip HealthKit?
Nu puteți, pentru accesul de citire: HealthKit îl ascunde pentru a proteja confidențialitatea, iar un tip refuzat nu returnează date. Tratați "fără date" ca pe o stare normală și oferiți o modalitate de a revizui permisiunile în aplicația Health.
De ce numărul pașilor mei este mai mare decât în aplicația Health?
Probabil sumați mostre brute din mai multe surse (iPhone și Watch). Utilizați HKStatisticsCollectionQuery cu .cumulativeSum, care aplică propria dedublare a Apple Health.
Ce cod LOINC este variabilitatea ritmului cardiac de pe Apple Watch?
Apple Health stochează HRV ca SDNN, care corespunde LOINC 80404-7. Health Connect stochează RMSSD, o statistică diferită, deci nu amestecați cele două sub un singur cod.
Conexe
- Date de la dispozitive purtabile în FHIR: tabelul de mapare și codul backend
- Health Connect la FHIR: același lucru pe Android
- Cum să construiești o aplicație de înregistrare personală a sănătății
- Cum să construiești o aplicație de asistență medicală cu Flutter
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card