Présentation de HealthKit

Dans cet article HealthKit, vous apprendrez comment demander l'autorisation d'accéder aux données HealthKit, ainsi que lire et écrire des données dans le référentiel central HealthKit. L'article utilise la version Swift 4, iOS 11, Xcode 9.

HealthKit est une API qui a été introduite dans iOS 8. HealthKit sert de référentiel central pour toutes les données liées à la santé, permettant aux utilisateurs de créer un profil biologique et de stocker des données d'entraînement.

En lisant l'article HealthKit, vous allez créer l'application de suivi de formation la plus simple et apprendre:

  • Comment demander une autorisation et accéder aux données HealthKit
  • Comment lire les données HealthKit et les afficher dans un UITableView
  • Comment écrire des données dans le référentiel central HealthKit

Prêt à démarrer avec HealthKit? Continuez à lire!

Remarque: Pour travailler sur ce didacticiel, vous aurez besoin d'un compte de développeur iOS actif. Sans cela, vous ne pouvez pas activer la fonctionnalité HealthKit et accéder au référentiel HealthKit.

Commencer


L'application de démarrage suit la combustion des calories pendant un programme d'entraînement. Pour les initiés et les mondains d'Hollywood, il devrait être évident que je parle de Prancercise .

Prancercise

Téléchargez le projet de démarrage et ouvrez-le dans Xcode .

Compilez et exécutez l'application. Vous verrez le «squelette» de l'interface utilisateur. Au cours des deux prochains articles, vous ajouterez progressivement des fonctionnalités pour cette application.

image

Attribuer une équipe


HealthKit est un cadre spécial. L'application ne pourra pas l'utiliser si vous n'avez pas de compte développeur actif. Après avoir un compte développeur, vous pouvez affecter votre équipe.

Sélectionnez PrancerciseTracker dans le navigateur de projet, puis sélectionnez la cible PrancerciseTracker . Accédez à l'onglet Général et cliquez sur le champ Équipe .

Sélectionnez la commande associée à votre compte développeur:

image

Autorisations / droits


HealthKit possède également son propre ensemble de droits, et vous devrez les activer afin de créer des applications qui utilisent le framework.

Ouvrez l'onglet Capacités dans l'éditeur cible et activez HealthKit , comme indiqué dans la capture d'écran ci-dessous:

image

Attendez que Xcode configure pour vous HealthKit. En règle générale, il n'y a pas de problème ici, mais vous pouvez toujours en rencontrer si vous oubliez de spécifier correctement l'identifiant d'équipe et de bundle.

Maintenant, tout est prêt. Il vous suffit de demander à l'utilisateur l'autorisation d'utiliser HealthKit.

Autorisations


HealthKit fonctionne avec des données confidentielles et sensibles. Tout le monde ne se sent pas à l'aise pour permettre aux applications installées d'accéder à ces informations.

C'est pourquoi HealthKit dispose d'un solide système de confidentialité. HealthKit n'a accès qu'aux données que les utilisateurs acceptent de partager. Pour créer un profil pour les utilisateurs de votre Prancercise Tracker, vous devez d'abord obtenir l'autorisation d'accéder à chaque type de données.

Mise à jour de la description d'utilisation


Tout d'abord, vous devez décrire pourquoi vous demandez des indicateurs de santé à vos utilisateurs. Xcode vous donne la possibilité de le spécifier dans le fichier Info.plist de votre application.

Ouvrez Info.plist . Ajoutez ensuite les clés suivantes:
Confidentialité - Description d'utilisation de Health Share
Confidentialité - Description de l'utilisation de la mise à jour de la santé

Ces clés stockent le texte qui sera affiché lorsque l'écran de connexion HeathKit apparaît. La description d'utilisation du partage de santé fait référence à la section de données qui doit être lue à partir de HealthKit. La description d'utilisation de la mise à jour d'intégrité correspond aux données écrites dans HealthKit.

Vous pouvez y «ajouter» tout ce que vous voulez. Il s'agit généralement d'une description: «Nous utiliserons vos informations de santé pour mieux suivre vos séances d'entraînement.»

N'oubliez pas que si ces clés ne sont pas installées, l'application se bloque lorsque vous essayez de vous connecter à HealthKit.

Autorisation HealthKit


Ouvrez le fichier HealthKitSetupAssistant.swift dans lequel se trouve la méthode de classe que vous utiliserez pour autoriser dans HealthKit.

class func authorizeHealthKit(completion: @escaping (Bool, Error?) -> Swift.Void) { } 

La méthode authorizeHealthKit (complétement :) ne prend aucun paramètre et a une complication qui renvoie un booléen ( succès ou échec ) et une erreur facultative en cas de problème. Si des erreurs sont renvoyées, vous les transmettrez à complition dans deux cas:

  1. HealthKit peut ne pas être disponible sur votre appareil. Par exemple, si l'application s'exécute sur un iPad.
  2. Certains types de données peuvent ne pas être disponibles dans la version actuelle de HealthKit.

Brisons ce processus. Pour autoriser HealthKit, la méthode authorizeHealthKit (complétement :) doit effectuer les quatre étapes suivantes:

  1. Vérifiez si Healthkit est disponible sur cet appareil. Si ce n'est pas le cas, renvoyez un échec et une erreur à complition.
  2. Préparez les types de données d'intégrité. Prancercise Tracker va lire et écrire sur HealthKit.
  3. Organisez ces données dans une liste de types à lire et de types à écrire.
  4. Demander une autorisation. Si cette action réussit, toutes les activités étaient correctes et terminées correctement.

Vérification de la disponibilité de HealthKit


Tout d'abord, vous devez vérifier la disponibilité de HealthKit sur l'appareil.
Collez le code suivant au début de la méthode authorizeHealthKit (complétement :) :

 //1. ,      HealthKit guard HKHealthStore.isHealthDataAvailable() else { completion(false, HealthkitSetupError.notAvailableOnDevice) return } 

Vous interagirez très souvent avec HKHealthStore . Il s'agit d'un référentiel central qui stocke les données de santé des utilisateurs. La méthode isHealthDataAvailable () vous aidera à comprendre si la machine utilisateur actuelle prend en charge les données Heathkit.

L'instruction guard empêche l'application d'exécuter le reste de la méthode authorizeHealthKit (complétement :) si HealthKit n'est pas disponible sur le périphérique. Lorsque cela se produit, le bloc d'achèvement est appelé avec l'erreur notAvailableOnDevice . Vous pouvez simplement le restituer à la console ou au contrôleur principal pour traiter les étapes supplémentaires en cas d'une telle erreur.

Préparation des données


Une fois que vous savez que HealthKit est disponible sur l'appareil de l'utilisateur, il est temps de préparer les types de données qui seront lues et écrites dans HealthKit.
HealthKit fonctionne avec le type HKObjectType . Chaque type qui entre ou revient dans le référentiel central HealthKit est une sorte de HKObjectType . Vous verrez également HKSampleType et HKWorkoutType . Les deux héritent de HKObjectType , donc en gros c'est la même chose.

Collez l'extrait de code suivant immédiatement après le premier extrait de code:

 //2.   ,     HealthKit guard let dateOfBirth = HKObjectType.characteristicType(forIdentifier: .dateOfBirth), let bloodType = HKObjectType.characteristicType(forIdentifier: .bloodType), let biologicalSex = HKObjectType.characteristicType(forIdentifier: .biologicalSex), let bodyMassIndex = HKObjectType.quantityType(forIdentifier: .bodyMassIndex), let height = HKObjectType.quantityType(forIdentifier: .height), let bodyMass = HKObjectType.quantityType(forIdentifier: .bodyMass), let activeEnergy = HKObjectType.quantityType(forIdentifier: .activeEnergyBurned) else { completion(false, HealthkitSetupError.dataTypeNotAvailable) return } 

Wow, c'est un grand garde ! Il s'agit également d'un excellent exemple d'utilisation d'une seule protection pour récupérer plusieurs options.

Pour créer un HKObjectType pour ces caractéristiques, vous devez utiliser HKObjectType.characteristicType (forIdentifier :) ou HKObjectType.quantityType (forIdentifier :)
Les types de caractéristiques et les types de quantités sont des énumérations définies par le cadre. HealthKit démarre avec eux.

Vous remarquerez également que si une caractéristique ou un type de sélection n'est pas disponible, la méthode échouera. C'est intentionnel. Votre application doit toujours savoir exactement avec quels types de HealthKit elle peut fonctionner, le cas échéant.

Préparation d'une liste de types de données pour la lecture et l'écriture


Il est maintenant temps de préparer une liste de types de données pour la lecture et l'écriture.
Collez ce troisième code dans la méthode authorizeHealthKit (complétement :) immédiatement après la deuxième partie:

 //3.   ,  HealthKit     let healthKitTypesToWrite: Set<HKSampleType> = [bodyMassIndex, activeEnergy, HKObjectType.workoutType()] let healthKitTypesToRead: Set<HKObjectType> = [dateOfBirth, bloodType, biologicalSex, bodyMassIndex, height, bodyMass, HKObjectType.workoutType()] 

HealthKit attend un ensemble d'objets HKSampleType qui représentent les types de données que votre utilisateur peut écrire, et attend également qu'un ensemble d'objets HKObjectType soit affiché pour votre application.

HKObjectType.workoutType () est un type spécial de HKObjectType . C'est n'importe quel entraînement.

Autorisation HealthKit


La dernière partie est la plus simple. Il vous suffit de demander l'autorisation à HealthKit. Collez ce dernier morceau de code:

 //4.    HKHealthStore().requestAuthorization(toShare: healthKitTypesToWrite, read: healthKitTypesToRead) { (success, error) in completion(success, error) } 

Ce code demande l'autorisation à HealthKit, puis appelle la fin. Ils utilisent des variables pour les opérations réussies et les erreurs transmises par la méthode requestAuthorization (toShare: read: complétement :) de HKHealthStore .

Vous pouvez le considérer comme une redirection. Au lieu de gérer l'achèvement dans HealthKitSetupAssistant, vous passez le paquet au contrôleur principal, qui peut afficher un avertissement ou entreprendre une autre action.

Le projet possède déjà un bouton Authorize HealthKit et il appelle la méthode authorizeHealthKit () dans MasterViewController. C'est l'endroit idéal pour appeler la méthode d'autorisation que nous venons d'écrire.

Ouvrez MasterViewController.swift , recherchez la méthode authorizeHealthKit ( ) et collez ce code:

 HealthKitSetupAssistant.authorizeHealthKit { (authorized, error) in guard authorized else { let baseMessage = "HealthKit Authorization Failed" if let error = error { print("\(baseMessage). Reason: \(error.localizedDescription)") } else { print(baseMessage) } return } print("HealthKit Successfully Authorized.") } 

Ce code utilise la méthode authorizeHealthKit (complétement :) que vous venez d'implémenter. Une fois terminé, il affichera un message dans la console pour indiquer si l'autorisation a réussi dans HealthKit.

Lancez l'appli. Cliquez sur Autoriser HealthKit dans la fenêtre principale et vous verrez un écran d'autorisation contextuel:

image

Activez tous les commutateurs, faites défiler pour les voir tous et appuyez sur Autoriser . Dans la console, vous devriez voir un message comme celui-ci:

 HealthKit Successfully Authorized. 

Super! L'application a accès au référentiel central de HealthKit. Il est maintenant temps de commencer à suivre les articles.

Caractéristiques et échantillons


Dans cette section, vous apprendrez:

  • Comment lire les caractéristiques biologiques de votre utilisateur.
  • Comment lire et écrire différents types d'échantillons (poids, taille, etc.)

En règle générale, les caractéristiques biologiques sont des types d'éléments qui ne changent pas, tout comme votre groupe sanguin. Les échantillons sont des éléments qui changent fréquemment, comme le poids.

Afin de suivre correctement l'efficacité du mode d' entraînement Prancercise , l'application Prancercise Tracker doit recevoir un échantillon du poids et de la taille de l'utilisateur. Ensemble, ces échantillons peuvent être utilisés pour calculer l'indice de masse corporelle (IMC).

Remarque: L'indice de masse corporelle (IMC) est un indicateur largement utilisé de la graisse corporelle et est calculé en fonction du poids et de la taille d'une personne. Découvrez-en plus ici .

Spécifications de lecture


Prancercise Tracker n'enregistre pas les caractéristiques biologiques. Il les obtient de HealthKit. Cela signifie que ces caractéristiques doivent d'abord être stockées dans le référentiel central HeathKit.

Si vous ne l'avez pas encore fait, il est temps d'en dire un peu plus sur HeathKit .

Ouvrez l'application Santé sur votre appareil ou votre simulateur. Sélectionnez l'onglet Données de santé. Cliquez ensuite sur l'icône de profil dans le coin supérieur droit pour afficher votre profil de santé. Cliquez sur Modifier et entrez la date de naissance, le sexe et le groupe sanguin:

image

Maintenant que HealthKit connaît votre date de naissance, votre sexe et votre groupe sanguin, il est temps de lire ces fonctionnalités dans Prancercise Tracker .

Revenez à Xcode et ouvrez ProfileDataStore.swift . La classe ProfileDataStore représente votre point d'accès à toutes les données liées à la santé de vos utilisateurs.

Collez la méthode suivante dans ProfileDataStore :

 class func getAgeSexAndBloodType() throws -> (age: Int, biologicalSex: HKBiologicalSex, bloodType: HKBloodType) { let healthKitStore = HKHealthStore() do { //1. This method throws an error if these data are not available. let birthdayComponents = try healthKitStore.dateOfBirthComponents() let biologicalSex = try healthKitStore.biologicalSex() let bloodType = try healthKitStore.bloodType() //2. Use Calendar to calculate age. let today = Date() let calendar = Calendar.current let todayDateComponents = calendar.dateComponents([.year], from: today) let thisYear = todayDateComponents.year! let age = thisYear - birthdayComponents.year! //3. Unwrap the wrappers to get the underlying enum values. let unwrappedBiologicalSex = biologicalSex.biologicalSex let unwrappedBloodType = bloodType.bloodType return (age, unwrappedBiologicalSex, unwrappedBloodType) } } 

La méthode getAgeSexAndBloodType () appelle HKHealthStore , demandant la date de naissance, le sexe et le type de sang de l'utilisateur. Il calcule également l'âge de l'utilisateur en utilisant la date de naissance.

  1. Vous avez peut-être remarqué que cette méthode peut provoquer une erreur. Cela se produit chaque fois qu'une date de naissance, un sexe ou un groupe sanguin n'a pas été enregistré dans le référentiel central HealthKit. Comme vous venez de saisir ces informations dans votre application, vous ne devez pas provoquer d'erreurs.
  2. À l'aide de la classe Calendar , vous pouvez convertir n'importe quelle date en un ensemble de composants de date . C'est vraiment pratique lorsque vous voulez avoir un an pour un rendez-vous. Ce code obtient simplement votre année de naissance, l'année en cours, puis calcule la différence.
  3. Les variables «développées» sont nommées de telle manière qu'il est clair que vous devez accéder à l'énumération de base à partir de la classe wrapper ( HKBiologicalSexObject et HKBloodTypeObject ).

Mise à jour de l'interface utilisateur


Si vous compilez et exécutez maintenant l'application, vous ne verrez aucune modification dans l'interface utilisateur, car vous n'y avez pas encore connecté cette logique.
Ouvrez ProfileViewController.swif t et recherchez la méthode loadAndDisplayAgeSexAndBloodType ( )

Cette méthode utilisera votre ProfileDataStore pour charger des caractéristiques biologiques dans l'interface utilisateur.

Collez le code suivant dans la méthode loadAndDisplayAgeSexAndBloodType () :

 do { let userAgeSexAndBloodType = try ProfileDataStore.getAgeSexAndBloodType() userHealthProfile.age = userAgeSexAndBloodType.age userHealthProfile.biologicalSex = userAgeSexAndBloodType.biologicalSex userHealthProfile.bloodType = userAgeSexAndBloodType.bloodType updateLabels() } catch let error { self.displayAlert(for: error) } 

Ce bloc de code charge l'âge, le sexe et le groupe sanguin en tant que tuple. Il définit ensuite ces champs dans l'instance locale du modèle UserHealthProfile. Enfin, il met à jour l'interface utilisateur avec les nouveaux champs de UserHealthProfile en appelant la méthode updateLabels () .

Étant donné que la méthode ProfileDataStore getAgeSexAndBloodType () peut générer une erreur, ProfileViewController doit la gérer. Dans ce cas, vous prenez simplement l'erreur et la présentez comme un avertissement.

Tout cela est super, mais il y a un hic. La méthode updateLabels () ne fait encore rien. Ceci est juste une annonce vierge. Cette fois, passons à l'interface utilisateur.

Recherchez la méthode updateLabels () et collez-y ce code:

 if let age = userHealthProfile.age { ageLabel.text = "\(age)" } if let biologicalSex = userHealthProfile.biologicalSex { biologicalSexLabel.text = biologicalSex.stringRepresentation } if let bloodType = userHealthProfile.bloodType { bloodTypeLabel.text = bloodType.stringRepresentation } 

Le code est assez simple. Si l'utilisateur a défini l'âge, il sera formaté dans une étiquette. Il en va de même pour le sexe biologique et le groupe sanguin. La variable stringRepresentation convertit l'énumération en chaîne à des fins d'affichage.

Compilez et exécutez l'application. Accédez à l'écran Profil et IMC. Cliquez sur le bouton Lire les données HealthKit.

image

Si vous avez déjà entré vos informations dans l'application, elles devraient apparaître dans les raccourcis de cet écran. Si vous ne l'avez pas encore fait, un message d'erreur apparaîtra.

Ouah! Vous lisez et affichez des données directement à partir de HealthKit .

Échantillons de requête


Il est maintenant temps de lire le poids et la taille de l'utilisateur. Ils seront utilisés pour calculer et afficher l'IMC dans la vue de profil.

Les caractéristiques biologiques sont facilement disponibles car elles ne changent presque jamais. Les échantillons nécessitent une approche beaucoup plus complexe. Ils utilisent HKQuery , plus précisément HKSampleQuery .

Pour demander des échantillons à HealthKit, vous aurez besoin de:

  1. Précisez le type d'échantillon que vous souhaitez demander (poids, taille, etc.),
  2. Quelques options supplémentaires qui aident à filtrer et à trier les données. Pour ce faire, vous pouvez passer un NSPredicate facultatif ou un tableau de NSSortDescriptors .

Remarque: Si vous connaissez CoreData, vous avez probablement remarqué quelques similitudes. HKSampleQuery est très similaire à NSFetchedRequest pour un type d'objet, où vous spécifiez les descripteurs de prédicat et de tri, puis spécifiez le contexte de l'objet pour exécuter la requête pour obtenir les résultats.

Une fois votre requête configurée, il vous suffit d'appeler la méthode HKHealthStore ExecuteQuery () pour obtenir les résultats.

Pour Prancercise Tracker, vous allez créer une fonction unique et universelle qui télécharge les derniers échantillons de tout type. Ainsi, vous pouvez l'utiliser à la fois pour le poids et la taille.

Ouvrez ProfileDataStore.swift et collez la méthode suivante dans la classe, juste en dessous de la méthode getAgeSexAndBloodType () :

 class func getMostRecentSample(for sampleType: HKSampleType, completion: @escaping (HKQuantitySample?, Error?) -> Swift.Void) { //1.  HKQuery    . let mostRecentPredicate = HKQuery.predicateForSamples(withStart: Date.distantPast, end: Date(), options: .strictEndDate) let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false) let limit = 1 let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescriptor]) { (query, samples, error) in //2.       . DispatchQueue.main.async { guard let samples = samples, let mostRecentSample = samples.first as? HKQuantitySample else { completion(nil, error) return } completion(mostRecentSample, nil) } } HKHealthStore().execute(sampleQuery) } 

Cette méthode utilise le type d'échantillon (taille, poids, IMC, etc.). Il crée ensuite une requête pour récupérer le dernier échantillon de ce type. Si vous passez par le type d'échantillon pour la croissance, vous reviendrez à votre dernier record de croissance.

Il se passe beaucoup de choses ici. Je vais m'arrêter pour expliquer quelques choses.

  1. Il existe plusieurs méthodes dans HKQuery qui peuvent vous aider à filtrer vos exemples de requête HealthKit. Dans ce cas, nous utilisons le prédicat de date intégré.
  2. La demande d'échantillons à HealthKit est un processus asynchrone. C'est pourquoi le code du gestionnaire d'achèvement se trouve à l'intérieur du bloc Dispatch. La conformité est requise sur le fil principal. Sinon, l'application échouera.

Si tout se passe bien, votre demande sera exécutée et vous obtiendrez un échantillon soigné retourné sur le thread principal , où le ProfileViewController peut mettre son contenu dans l'étiquette. Faisons cette partie maintenant.

Affichage d'échantillons dans l'interface utilisateur


Dans la section précédente, vous avez téléchargé des données depuis HealthKit . Enregistrez-les en tant que modèle dans ProfileViewController , puis mettez à jour le contenu en lignes à l'aide de la méthode ProfileViewController updateLabels ()

Tout ce que vous avez à faire est d'étendre ce processus en ajoutant une fonction qui charge les exemples, les traite pour l'interface utilisateur, puis appelle updateLabels () pour remplir les étiquettes avec du texte.

Ouvrez le fichier ProfileViewController.swift , recherchez la méthode loadAndDisplayMostRecentHeight ( ) et collez le code suivant:

 //1.  HealthKit      guard let heightSampleType = HKSampleType.quantityType(forIdentifier: .height) else { print("Height Sample Type is no longer available in HealthKit") return } ProfileDataStore.getMostRecentSample(for: heightSampleType) { (sample, error) in guard let sample = sample else { if let error = error { self.displayAlert(for: error) } return } //2.     ,   , //    . let heightInMeters = sample.quantity.doubleValue(for: HKUnit.meter()) self.userHealthProfile.heightInMeters = heightInMeters self.updateLabels() } 

  1. Cette méthode commence par créer un type d'échantillon de croissance. Il transmet ensuite ce type d'échantillon à la méthode que vous venez d'écrire, qui renverra l'échantillon de croissance d'utilisateurs le plus récent enregistré dans HealthKit.
  2. Dès que l'échantillon revient, la croissance est convertie en mètres et stockée dans le modèle UserHealthProfile. L' interface utilisateur sera alors mise à jour.

Remarque: vous souhaitez généralement convertir un échantillon de quantité en unité standard. Pour ce faire, le code ci-dessus utilise la méthode doubleValue (for :) , qui vous permet de transmettre les données pertinentes dont vous avez besoin (dans ce cas, les compteurs) à HKUnit .

Vous pouvez créer différents types de HKUnits en utilisant certaines des méthodes de classe courantes disponibles via HealthKit . Pour obtenir des compteurs, vous pouvez simplement utiliser la méthode meter () dans HKUnit , et ce sera ce dont vous avez besoin.

Avec une croissance réglée. Et le poids? Tout est assez similaire, mais vous devrez remplir la méthode loadAndDisplayMostRecentWeight () dans ProfileViewController .

Collez le code suivant dans la méthode loadAndDisplayMostRecentWeight () :

 guard let weightSampleType = HKSampleType.quantityType(forIdentifier: .bodyMass) else { print("Body Mass Sample Type is no longer available in HealthKit") return } ProfileDataStore.getMostRecentSample(for: weightSampleType) { (sample, error) in guard let sample = sample else { if let error = error { self.displayAlert(for: error) } return } let weightInKilograms = sample.quantity.doubleValue(for: HKUnit.gramUnit(with: .kilo)) self.userHealthProfile.weightInKilograms = weightInKilograms self.updateLabels() } 

Vous créez le type d'échantillon que vous souhaitez recevoir, demandez HealthKit pour cela, effectuez quelques conversions d'unités, enregistrez-le dans votre modèle et mettez à jour l'interface utilisateur.

Pour le moment, cela peut montrer que le travail est fait, mais il y a autre chose. La fonction updateLabels () n'a pas connaissance des nouvelles données que vous avez mises à sa disposition.

Corrigeons-le.

Ajoutez les lignes suivantes à la fonction updateLabels () , juste en dessous de la partie où vous développez le groupe sanguin pour l'afficher sur l'interface utilisateur:

 if let weight = userHealthProfile.weightInKilograms { let weightFormatter = MassFormatter() weightFormatter.isForPersonMassUse = true weightLabel.text = weightFormatter.string(fromKilograms: weight) } if let height = userHealthProfile.heightInMeters { let heightFormatter = LengthFormatter() heightFormatter.isForPersonHeightUse = true heightLabel.text = heightFormatter.string(fromMeters: height) } if let bodyMassIndex = userHealthProfile.bodyMassIndex { bodyMassIndexLabel.text = String(format: "%.02f", bodyMassIndex) } 

En suivant le modèle d'origine dans la fonction updateLabels () , il étend la taille, le poids et l'indice de masse corporelle dans votre modèle UserHealthProfile . S'ils sont disponibles, ils génèrent les lignes appropriées et les affectent à des étiquettes sur l'écran de l'utilisateur.

MassFormatter et LengthFormatter effectuent le travail de conversion de vos valeurs en chaînes.

L'indice de masse corporelle n'est pas réellement stocké dans le modèle UserHealthProfile . Il s'agit d'une propriété calculée qui effectue le calcul pour vous.

Cliquez sur la propriété bodyMassIndex et vous verrez ce que je veux dire:

 var bodyMassIndex: Double? { guard let weightInKilograms = weightInKilograms, let heightInMeters = heightInMeters, heightInMeters > 0 else { return nil } return (weightInKilograms/(heightInMeters*heightInMeters)) } 

L'indice de masse corporelle est une propriété facultative, c'est-à-dire qu'il peut retourner nil si vous n'avez spécifié ni la taille ni le poids (ou s'ils sont définis sur un nombre qui n'a aucun sens). Le calcul réel est simplement le poids divisé par la taille au carré.

Remarque: vous vous plongerez bientôt dans tout cela si vous n'avez pas ajouté de données à HealthKit pour les lire par l'application. Si vous ne l'avez pas déjà fait, vous devez au moins créer des échantillons de taille et de poids.

Ouvrez l'application Santé et accédez à l'onglet Données de santé. Là, sélectionnez le paramètre Body Measurements, puis sélectionnez Weight puis Add Data Point pour ajouter un nouvel échantillon de poids. Répétez le processus de croissance.

À ce stade, le Prancercise Tracker devrait être en mesure de lire un échantillon récent du poids et de la taille de votre utilisateur, puis de l'afficher dans le texte.

Compilez et exécutez les applications. Accédez à Profile & BMI . Cliquez ensuite sur le bouton Lire les données HealthKit .

image

Génial! Vous venez de lire vos premiers échantillons du référentiel HealthKit et de les utiliser pour calculer l'IMC.

Enregistrement d'échantillons


Dans Prancercise Tracker ont déjà un indice de masse corporelle de la calculatrice à portée de main. Utilisons-le pour enregistrer l'échantillon d'IMC de votre utilisateur.

Ouvrez ProfileDataStore.swift et ajoutez la méthode suivante:

 class func saveBodyMassIndexSample(bodyMassIndex: Double, date: Date) { //1. ,      guard let bodyMassIndexType = HKQuantityType.quantityType(forIdentifier: .bodyMassIndex) else { fatalError("Body Mass Index Type is no longer available in HealthKit") } //2.   HKUnit     let bodyMassQuantity = HKQuantity(unit: HKUnit.count(), doubleValue: bodyMassIndex) let bodyMassIndexSample = HKQuantitySample(type: bodyMassIndexType, quantity: bodyMassQuantity, start: date, end: date) //3.      HealthKit HKHealthStore().save(bodyMassIndexSample) { (success, error) in if let error = error { print("Error Saving BMI Sample: \(error.localizedDescription)") } else { print("Successfully saved BMI Sample") } } } 

Comme pour les autres types d'échantillons, vous devez d'abord vous assurer que le type d'échantillon est disponible dans HealthKit .

  1. Dans ce cas, le code vérifie s'il existe un type de quantité pour l'indice de masse corporelle. Si c'est le cas, il est utilisé pour créer un échantillon de quantité. Sinon, l'application cesse de fonctionner.
  2. count() HKUnit , , . - , , .
  3. HKHealthStore , . , .

Presque terminé. Pour résumer l'interface utilisateur.

Ouvrez ProfileViewController.swif , recherchez la méthode saveBodyMassIndexToHealthKit ( ). Cette méthode est appelée lorsque l'utilisateur clique sur le bouton Enregistrer l'IMC dans le tableau.

Collez le code suivant dans la méthode:

 guard let bodyMassIndex = userHealthProfile.bodyMassIndex else { displayAlert(for: ProfileDataError.missingBodyMassIndex) return } ProfileDataStore.saveBodyMassIndexSample(bodyMassIndex: bodyMassIndex, date: Date()) 

Vous vous souvenez que l'indice de masse corporelle est une propriété calculée qui renvoie une valeur lorsque des échantillons de taille et de poids sont chargés à partir de HealthKit . Ce code essaie de calculer cette propriété et, si possible, il sera transmis à la méthode saveBodyMassIndexSample (bodyMassIndex: date :) que vous venez d'écrire.

Il affiche également une alerte pratique si l'indice de masse corporelle ne peut pas être calculé pour une raison quelconque.

Compilez et exécutez l'application. Accédez à l'écran Profil et IMC . Téléchargez les données de HeathKit , puis cliquez sur le bouton Enregistrer l'IMC.

Regardez la console. Le voyez-vous?

    BMI 

Si oui, félicitations! Votre échantillon d'IMC est maintenant stocké dans le référentiel central HealthKit . Voyons voir si nous pouvons le trouver.

Ouvrez l'application Santé, appuyez sur l'onglet Données de santé, cliquez sur Mesures corporelles dans la vue tabulaire, puis cliquez sur Indice de masse corporelle.

image

Source: https://habr.com/ru/post/fr434978/


All Articles