Créer une application HealthKit à l'aide de SwiftUI
Obtenez des données sur le nombre de pas de HealthKit
Au cours de mon dernier projet, j'ai créé une application de régime qui nécessite d'obtenir le nombre de pas des utilisateurs à partir de l'application Santé sur leur iPhone. J'ai donc utilisé le framework d'Apple HealthKit
pour faire le travail.
Vous voulez savoir comment obtenir les données de nombre de pas des utilisateurs de Health à l'aide de HealthKit ? Eh bien, allons-y !
Plusieurs étapes doivent être effectuées pour obtenir le nombre de pas, c'est-à-dire :
- Activation des fonctionnalités de HealthKit dans notre projet
- Demander l'autorisation de l'application Santé des utilisateurs
- Récupérer les données du nombre de pas
- Vérifier l'état de l'autorisation sanitaire
- Création et mise à jour de l'UI
1. Activer les capacités de HealthKit dans notre projet
Pour activer les fonctionnalités de HealthKit dans notre application, ouvrez votre projet, accédez à Signing & Capabilities, cliquez sur le bouton plus en haut à droite et choisissez HealthKit.
Vous pouvez consulter les dossiers de santé cliniques si vous avez besoin d'accéder aux dossiers cliniques des utilisateurs et à la livraison en arrière-plan pour permettre d'observer les changements de données en temps réel.
Je ne le mettrai pas ici, car le nombre de pas n'est pas un dossier médical et je n'ai pas besoin des données en temps réel sur le nombre de pas.

Après cela, allez dans l'onglet Infos et nous devons ajouter une clé pour utiliser HealthKit. La clé dont nous avons besoin est NSHealthShareUsageDescription
et NSHealthUpdateUsageDescription
.

2. Demander l'autorisation de l'application de santé des utilisateurs
Avant de récupérer le nombre de pas, nous devons obtenir l'autorisation des utilisateurs pour accéder à leur application Santé.
Pour ce faire, j'ai créé un nouveau fichier appelé HealthKitManager
, avec une HealthKitManager
classe à l'intérieur.
N'oubliez pas d' import HealthKit
en haut, puis créez une fonction appelée setupHealthRequest
.
func setUpHealthRequest(healthStore: HKHealthStore, readSteps: @escaping () -> Void) {
if HKHealthStore.isHealthDataAvailable(), let stepCount = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount) {
healthStore.requestAuthorization(toShare: [stepCount], read: [stepCount]) { success, error in
if success {
readSteps()
} else if error != nil {
// handle your error here
}
}
}
}
- La première ligne
HKHealthStore.isHealthDataAvailable()
vérifie si Santé est disponible sur l'appareil. - Ensuite, spécifiez les données que nous voulons obtenir - c'est-à-dire le nombre de pas en utilisant
HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)
et déballez-les en utilisantif let
. - Après avoir spécifié les données, nous appelons la fonction
requestAuthorization()
. Cela déclenchera la fenêtre contextuelle d'autorisation de l'application Santé qui vous demandera de donner l'autorisation. Nous spécifions également le nombre de pas comme données à écrire et à lire. Ensuite, si l'utilisateur donne son autorisation, nous lirons le nombre de pas, sinon, nous traiterons l'erreur.
Maintenant que nous avons créé la setupHealthRequest()
méthode, configurons-la pour récupérer le nombre de pas des utilisateurs —readStepCount()
:
func readStepCount(forToday: Date, healthStore: HKHealthStore, completion: @escaping (Double) -> Void) {
guard let stepQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount) else { return }
let now = Date()
let startOfDay = Calendar.current.startOfDay(for: now)
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
let query = HKStatisticsQuery(quantityType: stepQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, error in
guard let result = result, let sum = result.sumQuantity() else {
completion(0.0)
return
}
completion(sum.doubleValue(for: HKUnit.count()))
}
healthStore.execute(query)
}
- La deuxième chose est de préparer une date comme prédicat pour lire les données de comptage de pas d'aujourd'hui. Après avoir spécifié la date, j'ajoute un prédicat avec l'option
.strictStartDate
qui signifie que les données que je lis doivent être dans la plage de temps spécifiée afin d'obtenir les données exactes du nombre de pas d'aujourd'hui. - La prochaine chose est une requête, j'utilise des options
.cumulativeSum
pour calculer la somme de toutes les étapes enregistrées dans une journée, car si vous ouvrez Santé et entrez dans les étapes, vous pouvez voir que les étapes sont enregistrées à l'heure, nous devons donc tout additionner de celui-ci pour obtenir le nombre total de pas. - Après avoir déballé la valeur du résultat, je renvoie l'achèvement avec la somme du nombre d'étapes convertie en une valeur double.
- Enfin, exécutez la requête à l'aide de
healthStore.execute(query)
.
private var healthStore = HKHealthStore()
private var healthKitManager = HealthKitManager()
@Published var userStepCount = ""
@Published var isAuthorized = false
healthKitManager
est l'instance de laHealthKitManager
classe qui a la méthode d'autorisation et de récupération des donnéesuserStepCount
est une variable pour le nombre de pas que nous récupéronsisAuthorized
pour vérifier si l'utilisateur a donné accès à Health ou non, j'ai marqué à la foisuserStepCount
etisAuthorized
commePublished
.
func healthRequest() {
healthKitManager.setUpHealthRequest(healthStore: healthStore) {
self.changeAuthorizationStatus()
self.readStepsTakenToday()
}
}
Voici le code de la readStepsTakenToday()
méthode :
func readStepsTakenToday() {
healthKitManager.readStepCount(forToday: Date(), healthStore: healthStore) { step in
if step != 0.0 {
DispatchQueue.main.async {
self.userStepCount = String(format: "%.0f", step)
}
}
}
}
Nous l'avons utilisé DispatchQueue.main.async
car la fonction englobante s'exécute sur un thread d'arrière-plan et nous devons mettre à jour la valeur à partir du thread principal.
4. Vérifiez l'état de l'autorisation sanitaire
Ensuite, nous devons vérifier le statut d'autorisation pour mettre à jour l'interface utilisateur. Pour cela, j'ai créé une méthode appelée changeAuthorizationStatus()
.
func changeAuthorizationStatus() {
guard let stepQtyType = HKObjectType.quantityType(forIdentifier: .stepCount) else { return }
let status = self.healthStore.authorizationStatus(for: stepQtyType)
switch status {
case .notDetermined:
isAuthorized = false
case .sharingDenied:
isAuthorized = false
case .sharingAuthorized:
isAuthorized = true
@unknown default:
isAuthorized = false
}
}
Remarque : Nous devons spécifier le nombre d'étapes en tant que variable dans la setupHealthRequest()
méthode, car le définir sur le type en lecture seule ( let
) renvoie un .sharingDenied
état. J'ai trouvé ceci sur StackOverflow et vous pouvez en savoir plus à ce sujet ici .
5. Création de l'interface utilisateur
Toutes nos méthodes sont définies ! Alors créons l'interface utilisateur maintenant.
C'est une interface simple. Si l'utilisateur n'a pas autorisé, nous afficherons un message Text
indiquant « Veuillez autoriser la santé ! » et a Button
pour déclencher la méthode d'autorisation. Sinon, il affichera le nombre de pas à l'écran.
import SwiftUI
struct ContentView: View {
@EnvironmentObject var vm: HealthKitViewModel
var body: some View {
VStack {
if vm.isAuthorized {
VStack {
Text("Today's Step Count")
.font(.title3)
Text("\(vm.userStepCount)")
.font(.largeTitle)
.fontWeight(.bold)
}
} else {
VStack {
Text("Please Authorize Health!")
.font(.title3)
Button {
vm.healthRequest()
} label: {
Text("Authorize HealthKit")
.font(.headline)
.foregroundColor(.white)
}
.frame(width: 320, height: 55)
.background(Color(.orange))
.cornerRadius(10)
}
}
}
.padding()
.onAppear {
vm.readStepsTakenToday()
}
}
}
Maintenant, exécutons-le sur le simulateur.

Nous avons récupéré avec succès les données du nombre de pas et les avons affichées. Mais remarquez que lorsque je quitte l'application et que je l'ouvre à nouveau, je dois appuyer sur le bouton d'autorisation pour que la vue mette à jour le nombre de récupérations.
Pour résoudre ce problème, nous invoquerons la changeAuthorizationStatus()
méthode dans la méthode ViewModel
's init
.
init() {
changeAuthorizationStatus()
}

Et c'est tout! Nous avons terminé avec succès les 5 étapes à faire.
Pour le projet terminé, vous pouvez consulter mon référentiel GitHub ici .
Et pour en savoir plus sur ce que vous pouvez faire avec HealthKit, vous pouvez lire la documentation ici .
Vous pouvez faire beaucoup plus avec HealthKit, de l'obtention du sexe des utilisateurs à l'analyse du sommeil et même des séances d'entraînement.
Merci et j'espère que cet article vous aidera!