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, στείλτε τις τιμές στο backend σας και γράψτε κάθε μετρική ως 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 ή web API. Τα δεδομένα παραμένουν στη συσκευή (και στο κρυπτογραφημένο αντίγραφο ασφαλείας iCloud του ατόμου). η εφαρμογή σας τα διαβάζει τοπικά.
Δικαιώματα
- Ενεργοποιήστε τη δυνατότητα HealthKit στο Xcode και προσθέστε
NSHealthShareUsageDescriptionστοInfo.plist(συνNSHealthUpdateUsageDescriptionμόνο αν γράφετε). - Ζητήστε τους τύπους που χρειάζεστε. Οι χρήστες μπορούν να επιτρέψουν κάποιους και να αρνηθούν άλλους, και το HealthKit δεν ενημερώνει την εφαρμογή σας αν η πρόσβαση ανάγνωσης απορρίφθηκε: ένας απορριφθείς τύπος απλώς επιστρέφει μηδενικά δεδομένα. Σχεδιάστε τις οθόνες για "μηδενικά δεδομένα" αντί για σφάλμα.
- Ζητήστε τη στιγμή που ο χρήστης συνδέεται, με μια πρόταση που εξηγεί το γιατί, όχι κατά την πρώτη εκκίνηση.
Ανάγνωση ημερήσιων τιμών σε 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 είναι αυτή η τοπική ημέρα με την χρονική της μετατόπιση.
Διατήρηση του αρχείου ενημερωμένο
- Κατά το άνοιγμα: διαβάστε τις ημέρες από τον τελευταίο επιτυχημένο συγχρονισμό κάθε φορά που η εφαρμογή έρχεται στο προσκήνιο. Αυτή είναι η αξιόπιστη βάση.
- Στο παρασκήνιο:
HKObserverQueryμεenableBackgroundDelivery(for:frequency:)ξυπνά την εφαρμογή σας όταν φτάνουν νέα δεδομένα· απαιτείται η άδεια παράδοσης παρασκηνίου του HealthKit, και το iOS αποφασίζει τον πραγματικό χρόνο. - Πρώτη σύνδεση: εισαγάγετε ένα περιορισμένο ιστορικό (για παράδειγμα 30 ημέρες) αντί για χρόνια, και μετά προχωρήστε.
Από τιμές Swift σε FHIR Observations
Στείλτε τον πίνακα DailyValue στο backend σας και γράψτε ένα 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 για δεδομένα υγείας
- Οδηγία Επανεξέτασης Εφαρμογών 5.1.3: τα δεδομένα υγείας δεν μπορούν να χρησιμοποιηθούν για διαφήμιση ή εξόρυξη δεδομένων, δεν μπορούν να κοινοποιηθούν σε τρίτους χωρίς τη συγκατάθεση του ατόμου, και οι προσωπικές πληροφορίες υγείας δεν μπορούν να αποθηκευτούν στο iCloud.
- Η πολιτική απορρήτου σας πρέπει να αναφέρει τι διαβάζετε και γιατί· η Apple το ελέγχει.
- Τα δεδομένα που γράφει η εφαρμογή σας στο Apple Health αποδίδονται στην εφαρμογή σας· τα δεδομένα που διαβάζετε διατηρούν την αρχική τους πηγή (
HKSource), την οποία θα πρέπει να μεταφέρετε στην εγγραφή ως σύστημα πηγής.
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 μπορεί να χρησιμοποιηθεί μόνο από μια εφαρμογή σε αυτήν τη συσκευή. Η εφαρμογή διαβάζει τα δεδομένα και τα στέλνει στον διακομιστή σας.
Υπάρχει Apple Health web API ή REST API;
Όχι. Η Apple δεν προσφέρει web ή 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, ένα διαφορετικό στατιστικό στοιχείο, οπότε μην αναμιγνύετε τα δύο κάτω από έναν κωδικό.
Σχετικά
- Δεδομένα φορητών συσκευών σε FHIR: ο πίνακας αντιστοίχισης και ο κώδικας backend
- Health Connect σε FHIR: το ίδιο στο Android
- Πώς να δημιουργήσετε μια εφαρμογή προσωπικού ιατρικού φακέλου
- Πώς να δημιουργήσετε μια εφαρμογή υγειονομικής περίθαλψης με Flutter
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card