Mesure et instrumentation
Utilisation de l'API Ios Healthkit pour suivre et afficher les données de condition physique
Table of Contents
Introduction à l'API AppleS HealthKit
À une époque où les données personnelles sur la santé conduisent à des idées concrètes, l'API de HealthKit iOS est devenue une pierre angulaire pour les développeurs de construction d'applications de fitness et de bien-être. Ce cadre, introduit par Apple avec iOS 8, fournit un dépôt unifié et sécurisé pour les informations sur la santé et les activités. En intégrant HealthKit, votre application peut lire et écrire à la boutique de données de l'application Santé, permettant aux utilisateurs de voir une vue consolidée de leurs étapes, fréquence cardiaque, analyse du sommeil, journaux alimentaires, et même des dossiers cliniques.
Comprendre l'architecture de HealthKit
HealthKit organise les données autour de deux concepts principaux : types de données et objets de données[. Les types de données définissent la catégorie de mesures, comme ou . Les objets de données sont les enregistrements réels, qui peuvent être des exemples (une seule mesure ou un seul événement), correlations[ (groupes d'échantillons associés), ou workouts. Le magasin HealthKit est crypté sur le terminal et synchronisé sur iCloud, mais seulement lorsque l'utilisateur permet explicitement la synchronisation de Santé. Chaque demande d'accès doit être autorisée par l'utilisateur via une boîte de dialogue système, assurant la conformité à la vie privée.
Composantes clés
- HKHealthStore – Point central d'entrée pour toutes les opérations de HealthKit.
- HKobjectType – Indique un type de données sur la santé (quantité, catégorie ou caractéristique).
- HKSampleQuery – Récupère un ensemble fixe d'échantillons stockés.
- HKStatistiquesQuery – Calcule les valeurs agrégées (somme, moyenne, min, max, etc.) sur un intervalle de temps.
- HKObserverQuery – Contrôle les modifications apportées aux types de données spécifiés, permettant des mises à jour de fond.
Établissement des autorisations – Demande d'accès
Avant tout échange de données, votre application doit demander l'autorisation d'utiliser . Vous devez déclarer les permissions de lecture et d'écriture dans vos avec les touches et . Pour le suivi de la condition physique, vous lisez généralement le compte des étapes, l'énergie active, la fréquence cardiaque et les séances d'entraînement potentiellement écrites.
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
}
}
Si l'utilisateur refuse, évitez de bloquer la fonctionnalité; expliquez plutôt pourquoi les données sont nécessaires et fournissez une alternative (p. ex., entrée manuelle). Rappelez-vous que les autorisations peuvent être modifiées plus tard dans l'onglet Sources de l'application Santé.
Les données de conditionnement physique
HealthKit offre plusieurs types de requêtes pour récupérer les données efficacement. Les applications de fitness les plus courantes sont les requêtes de type échantillon et les requêtes statistiques.
HKSampleQuery – Récupération de données brutes
Utilisez lorsque vous avez besoin d'enregistrements individuels, comme les 100 dernières lectures de fréquence cardiaque ou les journaux d'étapes d'aujourd'hui. Spécifiez un prédicat pour filtrer par date, source ou valeur. Pour les performances, limitez toujours le nombre de résultats retournés.
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)
HKStatistiquesQuery – Données agrégées
Pour les totaux, les moyennes ou les maximums sur une période donnée (p. ex., nombre d'étapes quotidiennes), utiliser .
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)
HKStatistiquesCollectionQuery – Données de série chronologique
Pour afficher un graphique des étapes par jour pour la semaine dernière, utilisez . Il regroupe les statistiques pour chaque jour entre une date de début et de fin, ce qui le rend idéal pour les tendances.
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)
Affichage des données de condition physique
Les chiffres bruts sont insignifiants sans visualisation claire. Une UI bien conçue transforme les données de HealthKit en idées motivantes.
- Sommaire : Afficher aujourd'hui le nombre de pas, les minutes actives et la tendance de la fréquence cardiaque dans un tableau de bord compact.
- Chartes: Utilisez des graphiques en ligne ou en barres pour afficher les marches hebdomadaires, l'énergie active mensuelle ou les zones de fréquence cardiaque.Les bibliothèques comme Les cartes rapides[ (iOS 16+) ou Les cartes (DGChartes) s'intègrent de façon transparente.
- Goal Rings: Apple , les anneaux d'activité classiques peuvent être émulés pour visualiser l'énergie, l'exercice, et les heures de stand.
- Sommaires de travail:[ Durée actuelle, fréquence cardiaque moyenne, distance et calories brûlées pour chaque entraînement enregistré.
Exemple : Construire un tableau de bord de compte des étapes
Combinez la requête statistique ci-dessus avec SwiftUI pour créer un compteur d'étapes à mise à jour en direct :
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
}
}
Mises à jour en temps réel avec HKObserverQuery
Pour garder votre tableau de bord en cours sans actualisation manuelle, configurer un . Le système avise votre application lorsque de nouvelles données sont enregistrées dans HealthKit (même pendant que l'application est en arrière-plan, si vous vous inscrivez pour la livraison de fond).
let observerQuery = HKObserverQuery(sampleType: stepType, predicate: nil) { query, completionHandler, error in
DispatchQueue.main.async { self.fetchTodaySteps() }
completionHandler()
}
healthStore.execute(observerQuery)
Pour les mises à jour de fond, vous devez également appeler . Notez que les gaz iOS callbacks de fond pour préserver la batterie; utilisez cette parcimonieusement et toujours gérer le gestionnaire d'achèvement.
Meilleures pratiques en matière de protection de la vie privée et de sécurité
Les données de santé sont sensibles. Apple applique des règles strictes, et le non-respect peut conduire à un rejet App Store.
- Demandes de données minimales:[ Ne demandez que les types de données que votre application utilise réellement. Évitez de demander des dossiers de santé -- si vous avez seulement besoin de compter les étapes.
- Clarifier les chaînes d'explication:[ La description d'utilisation dans Info.plist doit être spécifique, par exemple, -Cette application lit votre compte d'étape pour montrer votre activité quotidienne.
- Ne partage jamais les données brutes de HealthKit hors-dispositif sans le consentement explicite de l'utilisateur. Si vous synchronisez avec votre moteur de recherche, anonymisez et chiffrez les données.
- Respecter les modifications d'autorisation:[ Observer lorsque l'utilisateur révoque les autorisations par ou en vérifiant l'état d'autorisation avant chaque requête.
- Erreurs de main gracieusement:[ Les requêtes HealthKit peuvent échouer en raison de l'autorisation, du manque de données ou des erreurs de base de données.
Intégration avec Apple Watch et d'autres sources
HealthKit regroupe automatiquement les données d'Apple Watch, d'applications tierces et d'entrées manuelles. Votre application iOS n'a pas besoin de distinguer la source à moins que vous ne vouliez filtrer par source. Pour les applications d'entraînement, envisagez d'écrire des objets à HealthKit. Lorsqu'un utilisateur commence une séance d'entraînement sur Apple Watch, le système peut automatiquement enregistrer des paramètres ; votre app iOS compagnon peut les lire plus tard.
Pour écrire des données d'entraînement :
let workout = HKWorkout(activityType: .running, start: workoutStart, end: workoutEnd, duration: duration, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
healthStore.save(workout) { success, error in
// Handle
}
Vous pouvez également ajouter des échantillons associés (p. ex. fréquence cardiaque, itinéraire) à l'entraînement en utilisant et .
Pièges courants et comment les éviter
- En supposant que les données sont toujours disponibles:[ Un nouvel utilisateur peut ne pas avoir de données HealthKit. Concevez votre UI pour montrer les placeholders ou encouragez l'utilisateur à commencer à suivre via l'application Health ou Apple Watch.
- Il peut y avoir trop de données à la fois: De grandes requêtes (p. ex., tous les échantillons de l'année écoulée) peuvent être lentes et s'écraser sur la mémoire.
- Ignorer les fuseaux horaires: Les horodatages HealthKit sont en UTC. Lors du regroupement de jour, convertir en fuseau horaire local de l'utilisateur pour éviter tout désalignement.
- Blocking du thread principal:[ Les requêtes HealthKit sont asynchrones mais leurs gestionnaires de traitement d'achèvement ne peuvent pas fonctionner sur le thread principal.
- Pour vérifier la disponibilité des données de santé : HealthKit n'est pas disponible sur iPad et iPod touch. Appelez toujours avant toute interaction.
Élargir avec les dossiers de santé et les données cliniques
Pour les applications axées sur la santé clinique, HealthKit prend également en charge Health Records (via FHIR). Avec l'autorisation de l'utilisateur, votre application peut accéder aux immunisations, aux résultats de laboratoire, aux médicaments et aux conditions.
Conclusion
L'API iOS HealthKit offre une base solide et axée sur la confidentialité pour le suivi et l'affichage des données de fitness. En comprenant son modèle de permission, les types de requêtes et les meilleures pratiques, vous pouvez construire une application qui s'intègre parfaitement à l'écosystème de santé de l'utilisateur. Commencez par des requêtes simples de pas et de fréquence cardiaque, puis incorporez progressivement des fonctionnalités plus avancées comme les mises à jour de fond, la connectivité de la veille et les dossiers cliniques.
Pour plus de détails, consultez le document officiel , les lignes directrices sur l'interface humaine , et les ressources communautaires comme Ray Wenderlich="s HealthKit Tutorial pour des exemples de codes pratiques.