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, στείλτε τις τιμές στο 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 του ατόμου). η εφαρμογή σας τα διαβάζει τοπικά.

Δικαιώματα

  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 στο 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 για δεδομένα υγείας

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, ένα διαφορετικό στατιστικό στοιχείο, οπότε μην αναμιγνύετε τα δύο κάτω από έναν κωδικό.

Σχετικά

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