Εισαγωγή στο HealthKit API της Apple

Σε μια εποχή όπου τα δεδομένα για την προσωπική υγεία οδηγούν σε ενεργές ιδέες, το iOS HealthKit API έχει γίνει ακρογωνιαίος λίθος για προγραμματιστές που κατασκευάζουν εφαρμογές φυσικής κατάστασης και ευεξίας. Αυτό το πλαίσιο, που εισήγαγε η Apple με το iOS 8, παρέχει ένα ενιαίο, ασφαλές αποθετήριο για πληροφορίες για την υγεία και τη δραστηριότητα. Ενσωματώνοντας το HealthKit, η εφαρμογή σας μπορεί να διαβάσει από και να γράψει στο κατάστημα δεδομένων εφαρμογών για την υγεία, επιτρέποντας στους χρήστες να δουν μια ενοποιημένη άποψη των βημάτων τους, καρδιακό ρυθμό, ανάλυση ύπνου, διατροφικά αρχεία καταγραφής, ακόμη και κλινικά αρχεία.

Κατανόηση της Αρχιτεκτονικής του HealthKit

Το HealthKit οργανώνει δεδομένα γύρω από δύο πρωταρχικές έννοιες: Τύποι δεδομένων και αντικείμενα δεδομένων[.Τύποι δεδομένων καθορίζουν την κατηγορία μέτρησης, όπως ] ή . Αντικείμενα δεδομένων είναι τα πραγματικά αρχεία, τα οποία μπορούν να είναι [Τυποδείκτες] (μια ενιαία μέτρηση ή γεγονός), Συλλογές (ομάδες συγγενικών δειγμάτων), ή Εκστρατείες εργασίας[]. Το κατάστημα HealthKit κρυπτογραφείται on-device και συγχρονίζεται σε iCloud, αλλά μόνο όταν ο χρήστης επιτρέπει ρητά τον συγχρονισμό υγείας. Κάθε αίτημα πρέπει να επιτρέπεται από τον χρήστη μέσω διαλόγου, εξασφαλίζοντας τη συμμόρφωση.

Βασικά συστατικά

  • HKHealthStore ⁇ Κεντρικό σημείο εισόδου για όλες τις λειτουργίες του HealthKit.
  • HKObjectType ⁇ Προσδιορίζει έναν τύπο δεδομένων υγείας (ποσότητα, κατηγορία, ή χαρακτηριστικό).
  • HKSampleQuery ⁇ Ανακτά ένα σταθερό σύνολο αποθηκευμένων δειγμάτων.
  • HKStatisticsQuery ⁇ Υπολογίζει συγκεντρωτικές τιμές (άθροισμα, μέσος όρος, min, max, κ.λπ.) σε ένα χρονικό διάστημα.
  • HKObserverQuery ⁇ Παρακολούθηση αλλαγών σε συγκεκριμένους τύπους δεδομένων, επιτρέποντας ενημερώσεις στο φόντο.

⁇ αδειών ⁇ Αίτηση πρόσβασης

Πριν από οποιαδήποτε ανταλλαγή δεδομένων, η εφαρμογή σας πρέπει να ζητήσει άδεια χρησιμοποιώντας [[LFT:2]]. Πρέπει να δηλώσετε και τις δύο άδειες ανάγνωσης και εγγραφής στο [[LPT:3]] με τα κλειδιά [[LFT:4]] και [[LFT:5]]. Για την παρακολούθηση της φυσικής κατάστασης, συνήθως διαβάζετε το μέτρο βήμα, ενεργό ενέργεια, καρδιακό ρυθμό, και δυνητικά να γράψετε προπονήσεις.

import HealthKit

let healthStore = HKHealthStore()

func requestHealthPermissions() {
 guard HKHealthStore.isHealthDataAvailable() else { return }
 let readTypes: Set<HKObjectType> = [
 HKObjectType.quantityType(forIdentifier: .stepCount)!,
 HKObjectType.quantityType(forIdentifier: .heartRate)!,
 HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
 HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!
 ]
 let writeTypes: Set<HKSampleType> = [
 HKObjectType.workoutType()
 ]
 healthStore.requestAuthorization(toShare: writeTypes, read: readTypes) { success, error in
 // Handle response
 }
}

Αν ο χρήστης μειώνεται, αποφύγετε την λειτουργικότητα αποκλεισμού, εξηγήστε γιατί τα δεδομένα είναι απαραίτητα και παρέχετε μια εναλλακτική (π.χ., χειροκίνητη καταχώρηση). Θυμηθείτε ότι οι άδειες μπορούν να αλλάξουν αργότερα στην καρτέλα Πηγές της εφαρμογής Υγείας.

Ερωτήματα για τα στοιχεία καταλληλότητας

Το HealthKit προσφέρει διάφορους τύπους ερωτημάτων για να φέρει τα δεδομένα αποτελεσματικά.

HKSampleQuery ⁇ Ανάκτηση ακατέργαστων δεδομένων

Χρησιμοποιήστε όταν χρειάζεστε μεμονωμένες εγγραφές, όπως τις τελευταίες 100 ενδείξεις καρδιακού ρυθμού ή τα σημερινά αρχεία καταγραφής βαθμίδων. Καθορίστε ένα προκαθορισμένο φίλτρο κατά ημερομηνία, πηγή ή τιμή. Για την απόδοση, πάντα περιορίζετε τον αριθμό των επιστρεφόμενων αποτελεσμάτων.

let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startDate = Calendar.current.startOfDay(for: Date())
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: Date(), options: .strictStartDate)

let query = HKSampleQuery(sampleType: stepType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { query, samples, error in
 guard let samples = samples as? [HKQuantitySample] else { return }
 // Process samples
}
healthStore.execute(query)

HKStatisticsQuery ⁇ Συγκεντρωτικά δεδομένα

Για τα σύνολα, τους μέσους όρους ή τα μέγιστα όρια για μια συγκεκριμένη περίοδο (π.χ. ημερήσιος αριθμός βημάτων), χρησιμοποιήστε [.

let statisticsQuery = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { query, result, error in
 let sum = result?.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
 // Update UI with total steps
}
healthStore.execute(statisticsQuery)

HKStatisticsCollectionQuery ⁇ Χρόνος ⁇ Δεδομένα σειράς

Για να εμφανίσετε ένα διάγραμμα βημάτων ανά ημέρα για την περασμένη εβδομάδα, χρησιμοποιήστε [[LFT:11]].

let now = Date()
let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: now)!
let anchorDate = Calendar.current.startOfDay(for: now)
let daily = DateComponents(day: 1)

let collectionQuery = HKStatisticsCollectionQuery(quantityType: stepType, quantitySamplePredicate: nil, options: .cumulativeSum, anchorDate: anchorDate, intervalComponents: daily)
collectionQuery.initialResultsHandler = { query, results, error in
 results?.enumerateStatistics(from: sevenDaysAgo, to: now) { statistics, stop in
 let steps = statistics.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
 // Append steps for statistics.startDate
 }
}
healthStore.execute(collectionQuery)

Εμφάνιση δεδομένων καταλληλότητας

Ένας καλά σχεδιασμένος UI μετατρέπει τα δεδομένα του HealthKit σε υποκινητικές ιδέες.

  • Συνοπτική Κάρτες: Εμφάνιση του σημερινού κλιμακίου, ενεργών λεπτών, και τάση καρδιακού ρυθμού σε ένα συμπαγές ταμπλό.
  • Χράρια: Χρησιμοποιήστε διαγράμματα γραμμής ή bar για να εμφανίσετε εβδομαδιαία βήματα, μηνιαία ενεργό ενέργεια, ή ζώνες καρδιακού ρυθμού. Βιβλιοθήκες όπως Γραφεία αναστροφής[[LFT:3]] (iOS 16+) ή [[LFT:4]]Χαρτάκια (DGCharts) ενσωματώνονται απρόσκοπτα.
  • Goal Rings: Οι κλασικοί δακτύλιοι Δραστηριότητας της Apple μπορούν να μιμηθούν την ενέργεια, την άσκηση και τις ώρες αναμονής.
  • Περιλήψεις προπόνησης: Παρούσα διάρκεια, μέσος καρδιακός ρυθμός, απόσταση και θερμίδες που καίγονται για κάθε καταγραφόμενη προπόνηση.

Παράδειγμα: Κατασκευή ενός πίνακα καταμέτρησης βημάτων

Συνδυάστε το παραπάνω ερώτημα στατιστικών με το SwiftUI για να δημιουργήσετε ένα ζωντανό-updating μετρητή βημάτων:

struct StepCardView: View {
 @State private var steps: Double = 0

 var body: some View {
 VStack {
 Text("Steps")
 .font(.headline)
 Text("\(Int(steps))")
 .font(.largeTitle)
 .bold()
 }
 .onAppear { fetchTodaySteps() }
 }

 func fetchTodaySteps() {
 // Use HKStatisticsQuery as shown earlier
 }
}

Πραγματικές ⁇ Χρόνος ενημερώσεις με HKObserverQuery

Για να διατηρήσετε το ρεύμα του ταμπλό σας χωρίς χειροκίνητη ανανέωση, ρυθμίστε ένα . Το σύστημα ειδοποιεί την εφαρμογή σας όταν αποθηκεύονται νέα δεδομένα στο HealthKit (ακόμα και αν η εφαρμογή είναι στο φόντο, αν εγγραφείτε για παράδοση στο φόντο).

let observerQuery = HKObserverQuery(sampleType: stepType, predicate: nil) { query, completionHandler, error in
 DispatchQueue.main.async { self.fetchTodaySteps() }
 completionHandler()
}
healthStore.execute(observerQuery)

Για ενημερώσεις ιστορικού, πρέπει επίσης να καλέσετε [[LFT:16]]. Σημειώστε ότι το iOS ενεργοποιεί κλήσεις φόντου για τη διατήρηση της μπαταρίας. Χρησιμοποιήστε αυτό με φειδώ και πάντα χειρίζεστε τον χειριστή ολοκλήρωσης.

Βέλτιστες πρακτικές για την προστασία της ιδιωτικής ζωής και της ασφάλειας

Τα δεδομένα υγείας είναι ευαίσθητα. Η Apple επιβάλλει αυστηρούς κανόνες, και η μη συμμόρφωση μπορεί να οδηγήσει σε απόρριψη App Store.

  • Αιτήματα για τα ελάχιστα δεδομένα: Ζητήστε μόνο τους τύπους δεδομένων που χρησιμοποιεί η εφαρμογή σας. Αποφύγετε να ζητήσετε “καταγραφές υγείας” εάν χρειάζεστε μόνο καταμέτρηση βαθμίδων.
  • Καθαρίστε τις συμβολοσειρές επεξήγησης: Η περιγραφή χρήσης στο Info.plist θα πρέπει να είναι συγκεκριμένη, π.χ., «Αυτή η εφαρμογή διαβάζει το βήμα σας μετρούν για να δείξει την καθημερινή σας δραστηριότητα.»
  • Ποτέ μην μοιράζεστε τα ακατέργαστα δεδομένα HealthKit εκτός-συσκευής χωρίς ρητή συγκατάθεση χρήστη. Αν συγχρονιστείτε με το σύστημα υποστήριξης, ανώνυμη και κρυπτογραφήστε δεδομένα.
  • Επιθεωρήστε τις αλλαγές εξουσιοδότησης: Παρατηρήστε πότε ο χρήστης ανακαλεί τις άδειες μέσω ή ελέγχοντας την κατάσταση εξουσιοδότησης πριν από κάθε ερώτημα.
  • Χαντλ με χάρη: Οι ερωτήσεις για το HealthKit μπορεί να αποτύχουν λόγω εξουσιοδότησης, έλλειψης δεδομένων ή σφαλμάτων βάσης δεδομένων. Πάντα να εμφανίζεις ένα φιλικό προς το χρήστη μήνυμα.

Ενσωματώνοντας με το ρολόι της Apple και άλλες πηγές

Η εφαρμογή HealthKit αυτόματα συσσωρεύει δεδομένα από το Apple Watch, εφαρμογές τρίτων και εγγραφές εγχειριδίων. Η εφαρμογή iOS σας δεν χρειάζεται να διακρίνει την πηγή εκτός αν θέλετε συγκεκριμένα να φιλτράρετε από πηγή. Για εφαρμογές προπόνησης, σκεφτείτε να γράψετε αντικείμενα στο HealthKit. Όταν ένας χρήστης ξεκινά μια προπόνηση στο Apple Watch, το σύστημα μπορεί να καταγράφει αυτόματα μετρικές μετρήσεις. Η συνοδευτική εφαρμογή iOS μπορεί να τα διαβάσει αργότερα.

Για να γράψετε τα δεδομένα προπόνησης:

let workout = HKWorkout(activityType: .running, start: workoutStart, end: workoutEnd, duration: duration, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
healthStore.save(workout) { success, error in
 // Handle
}

Μπορείτε επίσης να προσθέσετε σχετικά δείγματα (π.χ. καρδιακός ρυθμός, διαδρομή) στην προπόνηση χρησιμοποιώντας ] και .

Συχνές Παγίδες και Πώς να τις Αποφύγετε

  • Υποθέτοντας ότι τα δεδομένα είναι πάντα διαθέσιμα: Ένας νέος χρήστης μπορεί να μην έχει δεδομένα HealthKit. Σχεδιάστε το UI σας για να εμφανίσετε τους κατόχους των τοποθεσιών ή να ενθαρρύνετε το χρήστη να αρχίσει να παρακολουθεί μέσω της εφαρμογής Health ή Apple Watch.
  • Αξίζει πάρα πολλά δεδομένα ταυτόχρονα: Μεγάλα ερωτήματα (π.χ. όλα τα δείγματα για το προηγούμενο έτος) μπορεί να είναι αργά και να συντριβούν στη μνήμη.
  • Αγνοώντας τις ζώνες ώρας: Οι χρονικές ενδείξεις υγείαςKit βρίσκονται σε UTC. Όταν ομαδοποιείται την ημέρα, μετατρέπονται στην τοπική ζώνη ώρας του χρήστη για να αποφευχθεί η κακή ευθυγράμμιση.
  • Πλοκάρισμα του κύριου νήματος: Τα ερωτήματα για το HealthKit είναι ασύγχρονα αλλά οι χειριστές ολοκλήρωσης τους δεν μπορούν να τρέξουν στο κύριο νήμα. Αποστολή ενημερώσεων UI σε .
  • Ξεχνώντας να ελέγξετε τη διαθεσιμότητα δεδομένων υγείας: Το HealthKit δεν είναι διαθέσιμο στο iPad και το iPod touch. Πάντα καλέστε πριν από οποιαδήποτε αλληλεπίδραση.

Επέκταση με τα αρχεία υγείας και τα κλινικά δεδομένα

Για εφαρμογές που επικεντρώνονται στην κλινική υγεία, το HealthKit υποστηρίζει επίσης Health Records] (μέσω FHIR). Με άδεια χρήστη, η εφαρμογή σας μπορεί να έχει πρόσβαση σε ανοσοποιήσεις, αποτελέσματα εργαστηρίου, φάρμακα και προϋποθέσεις. Αυτό ανοίγει δυνατότητες για ιχνηλάτες φαρμάκων, ελεγκτές αλλεργίας, ή χρόνια διαχείριση καταστάσεων. Ωστόσο, αυτοί οι τύποι δεδομένων απαιτούν πρόσθετη αναθεώρηση για το δικαίωμα των Health Records από την Apple.

Συμπέρασμα

Το iOS HealthKit API προσφέρει ένα ισχυρό, ιδιωτικότητα ⁇ εστιασμένο θεμέλιο για την παρακολούθηση και την εμφάνιση των δεδομένων καταλληλότητας. Κατανοώντας το μοντέλο της άδειας του, τους τύπους ερωτημάτων και τις βέλτιστες πρακτικές, μπορείτε να οικοδομήσετε μια εφαρμογή που ενσωματώνει απρόσκοπτα με το οικοσύστημα υγείας του χρήστη. Ξεκινήστε με απλά ερωτήματα βήμα και καρδιακό ρυθμό, στη συνέχεια σταδιακά ενσωματώνουν πιο προηγμένα χαρακτηριστικά όπως ενημερώσεις φόντου, παρακολούθηση συνδεσιμότητας, και κλινικές εγγραφές.

Για περαιτέρω ανάγνωση, συμβουλευτείτε τον επίσημο Apple HealthKit Documentation, τον HealthKit Human Interface Guidelines], και τους κοινοτικούς πόρους όπως Το HealthKit Tutorial] του Ρέι Βέντερλιχ για τα παραδείγματα κωδικών.