Einführung in HealthKit

In diesem HealthKit-Artikel erfahren Sie, wie Sie die Berechtigung zum Zugriff auf HealthKit-Daten anfordern sowie Daten lesen und in das zentrale HealthKit-Repository schreiben. Der Artikel verwendet die Version Swift 4, iOS 11, Xcode 9.

HealthKit ist eine API, die in iOS 8 eingeführt wurde. HealthKit dient als zentrales Repository für alle gesundheitsbezogenen Daten, sodass Benutzer ein biologisches Profil erstellen und Trainingsdaten speichern können.

Wenn Sie den HealthKit-Artikel lesen, erstellen Sie die einfachste Trainingsverfolgungsanwendung und lernen:

  • So fordern Sie eine Berechtigung an und greifen auf HealthKit-Daten zu
  • Lesen von HealthKit-Daten und Anzeigen in einer UITableView
  • So schreiben Sie Daten in das zentrale HealthKit-Repository

Bereit für den Einstieg in HealthKit? Lesen Sie weiter!

Hinweis: Um an diesem Tutorial arbeiten zu können, benötigen Sie ein aktives iOS-Entwicklerkonto. Ohne dies können Sie HealthKit Capability nicht aktivieren und keinen Zugriff auf das HealthKit-Repository erhalten.

Starten Sie


Die Starter-App verfolgt die Kalorienverbrennung während eines Trainingsprogramms. Für Hollywood-Insider und Prominente sollte es offensichtlich sein, dass ich über Prancercise spreche .

Prancercise

Laden Sie das Starterprojekt herunter und öffnen Sie es in Xcode .

Kompilieren Sie die Anwendung und führen Sie sie aus. Sie sehen das „Skelett“ der Benutzeroberfläche. In den nächsten beiden Artikeln werden Sie schrittweise Funktionen für diese Anwendung hinzufügen.

Bild

Ein Team zuweisen


HealthKit ist ein spezielles Framework. Die Anwendung kann sie nicht verwenden, wenn Sie kein aktives Entwicklerkonto haben. Nachdem Sie ein Entwicklerkonto haben, können Sie Ihr Team zuweisen.

Wählen Sie im Projektnavigator PrancerciseTracker aus, und wählen Sie dann das PrancerciseTracker-Ziel aus . Gehen Sie zur Registerkarte Allgemein und klicken Sie auf das Feld Team .

Wählen Sie den Befehl aus, der Ihrem Entwicklerkonto zugeordnet ist:

Bild

Berechtigungen / Ansprüche


HealthKit verfügt auch über eigene Rechte, die Sie aktivieren müssen, um Anwendungen zu erstellen, die das Framework verwenden.

Öffnen Sie die Registerkarte Funktionen im Zieleditor und aktivieren Sie HealthKit , wie im folgenden Screenshot gezeigt:

Bild

Warten Sie, bis Xcode HealthKit für Sie konfiguriert hat. In der Regel gibt es hier keine Probleme, aber Sie können trotzdem auf einige stoßen, wenn Sie vergessen, die Team- und Bundle-ID korrekt anzugeben.

Jetzt ist alles fertig. Sie müssen nur den Benutzer um Erlaubnis bitten, HealthKit zu verwenden.

Berechtigungen


HealthKit arbeitet mit vertraulichen und sensiblen Daten. Nicht jeder fühlt sich so wohl, dass installierte Anwendungen auf diese Informationen zugreifen können.

Deshalb verfügt HealthKit über ein starkes Datenschutzsystem. HealthKit hat nur Zugriff auf die Daten, deren Freigabe Benutzer zustimmen. Um ein Profil für Benutzer Ihres Prancercise Tracker zu erstellen, müssen Sie zunächst die Berechtigung zum Zugriff auf die einzelnen Datentypen einholen.

Verwendung Beschreibung Update


Zunächst müssen Sie beschreiben, warum Sie von Ihren Benutzern Gesundheitsindikatoren anfordern. Mit Xcode können Sie dies in der Info.plist- Datei Ihrer Anwendung angeben .

Öffnen Sie die Info.plist . Fügen Sie dann die folgenden Schlüssel hinzu:
Datenschutz - Beschreibung der Verwendung von Health Share
Datenschutz - Beschreibung der Verwendung des Gesundheitsupdates

Diese Tasten speichern den Text, der angezeigt wird, wenn der HeathKit-Anmeldebildschirm angezeigt wird. Die Beschreibung der Verwendung von Health Share bezieht sich auf den Datenabschnitt, der aus HealthKit gelesen werden soll. Die Beschreibung der Verwendung von Health Update entspricht den Daten, die in HealthKit geschrieben werden.

Sie können dort alles hinzufügen, was Sie wollen. Dies ist normalerweise eine Beschreibung: "Wir werden Ihre Gesundheitsinformationen verwenden, um Ihr Training besser zu verfolgen."

Beachten Sie, dass die Anwendung abstürzt, wenn Sie versuchen, sich bei HealthKit anzumelden, wenn diese Schlüssel nicht installiert sind.

HealthKit-Autorisierung


Öffnen Sie die Datei HealthKitSetupAssistant.swift , in der sich die Klassenmethode befindet, mit der Sie in HealthKit autorisieren.

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

Die Methode authorizeHealthKit (Vervollständigung :) akzeptiert keine Parameter und hat eine Komplement , die einen Booleschen Wert ( Erfolg oder Misserfolg ) und einen optionalen Fehler zurückgibt , falls etwas schief geht. Wenn Fehler zurückgegeben werden, werden Sie sie in zwei Fällen an Complition übergeben:

  1. HealthKit ist möglicherweise nicht auf Ihrem Gerät verfügbar. Zum Beispiel, wenn die Anwendung auf einem iPad ausgeführt wird.
  2. Einige Datentypen sind in der aktuellen Version von HealthKit möglicherweise nicht verfügbar.

Lassen Sie uns diesen Prozess unterbrechen. Um HealthKit zu autorisieren, muss die Methode authorizeHealthKit (Vervollständigung :) die folgenden vier Schritte ausführen:

  1. Überprüfen Sie, ob Healthkit auf diesem Gerät verfügbar ist. Wenn dies nicht der Fall ist, geben Sie einen Fehler und einen Fehler an die Ergänzung zurück.
  2. Bereiten Sie Gesundheitsdatentypen vor. Prancercise Tracker liest und schreibt in HealthKit.
  3. Organisieren Sie diese Daten in einer Liste von Typen, die gelesen und geschrieben werden sollen.
  4. Autorisierung anfordern. Wenn diese Aktion erfolgreich ist, waren alle Aktivitäten korrekt und wurden ordnungsgemäß abgeschlossen.

HealthKit-Verfügbarkeitsprüfung


Zunächst müssen Sie die Verfügbarkeit von HealthKit auf dem Gerät überprüfen.
Fügen Sie den folgenden Code am Anfang der Methode authorizeHealthKit (Vervollständigung :) ein :

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

Sie werden sehr oft mit HKHealthStore interagieren. Es ist ein zentrales Repository, in dem Benutzerzustandsdaten gespeichert werden. Die Methode isHealthDataAvailable () hilft Ihnen zu verstehen, ob das aktuelle Benutzergerät Heathkit-Daten unterstützt.

Die Guard-Anweisung verhindert, dass die Anwendung den Rest der Methode authorizeHealthKit (Vervollständigung :) ausführt, wenn HealthKit auf dem Gerät nicht verfügbar ist. In diesem Fall wird der Abschlussblock mit dem Fehler notAvailableOnDevice aufgerufen . Sie können dies einfach an die Konsole oder in den Hauptcontroller ausgeben, um im Falle eines solchen Fehlers weitere Schritte auszuführen.

Datenaufbereitung


Sobald Sie wissen, dass HealthKit auf dem Gerät des Benutzers verfügbar ist, müssen Sie die Datentypen vorbereiten, die in HealthKit gelesen und geschrieben werden.
HealthKit arbeitet mit dem Typ HKObjectType . Jeder Typ, der in das zentrale HealthKit-Repository eingeht oder in dieses zurückkehrt, ist eine Art HKObjectType . Sie sehen auch HKSampleType und HKWorkoutType . Beide erben von HKObjectType , daher ist dies im Grunde dasselbe.

Fügen Sie das folgende Code-Snippet unmittelbar nach dem ersten Code-Snippet ein:

 //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, das ist eine große Wache ! Dies ist auch ein gutes Beispiel für die Verwendung eines einzelnen Schutzes zum Abrufen mehrerer Optionen.

Um einen HKObjectType für diese Merkmale zu erstellen, müssen Sie entweder HKObjectType.characteristicType (forIdentifier :) oder HKObjectType.quantityType (forIdentifier :) verwenden.
Merkmalstypen und Mengenarten sind vom Framework definierte Aufzählungen. HealthKit Stiefel mit ihnen.

Sie werden auch feststellen, dass die Methode fehlschlägt, wenn ein Merkmal oder ein Auswahltyp nicht verfügbar ist. Dies ist beabsichtigt. Ihre Anwendung sollte immer genau wissen, mit welchen Arten von HealthKit sie gegebenenfalls arbeiten kann.

Vorbereiten einer Liste von Datentypen zum Lesen und Schreiben


Jetzt ist es Zeit, eine Liste von Datentypen zum Lesen und Schreiben zu erstellen.
Fügen Sie diesen dritten Code unmittelbar nach dem zweiten Teil in die Methode authorizeHealthKit (Vervollständigung :) ein :

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

HealthKit erwartet eine Reihe von HKSampleType- Objekten, die die Datentypen darstellen, die Ihr Benutzer schreiben kann, und erwartet, dass eine Reihe von HKObjectType-Objekten für Ihre Anwendung angezeigt wird.

HKObjectType.workoutType () ist ein spezieller Typ von HKObjectType . Es ist jedes Training.

HealthKit-Autorisierung


Der letzte Teil ist der einfachste. Sie müssen lediglich eine Autorisierung von HealthKit anfordern. Fügen Sie diesen letzten Code ein:

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

Dieser Code fordert die Autorisierung von HealthKit an und ruft dann die Fertigstellung auf. Sie verwenden Variablen für erfolgreiche Vorgänge und Fehler, die von der requestAuthorization- Methode von HKHealthStore (toShare: read: vervollständigung :) übergeben wurden .

Sie können sich das als Weiterleitung vorstellen. Anstatt die Fertigstellung im HealthKitSetupAssistant zu behandeln, übergeben Sie das Paket an den Hauptcontroller, der möglicherweise eine Warnung anzeigt oder eine andere Aktion ausführt.

Das Projekt verfügt bereits über eine Schaltfläche "HealthKit autorisieren" und ruft die Methode authorizeHealthKit () in MasterViewController auf. Dies ist der perfekte Ort, um die Autorisierungsmethode aufzurufen, die wir gerade geschrieben haben.

Öffnen Sie MasterViewController.swift , suchen Sie die Methode authorizeHealthKit ( ) und fügen Sie diesen Code ein:

 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.") } 

Dieser Code verwendet die soeben implementierte Methode authorizeHealthKit (Vervollständigung :) . Wenn der Vorgang abgeschlossen ist, wird in der Konsole eine Meldung angezeigt, die angibt, ob die Autorisierung in HealthKit erfolgreich war.

Starten Sie die App. Klicken Sie im Hauptfenster auf HealthKit autorisieren. Daraufhin wird ein Popup-Autorisierungsbildschirm angezeigt:

Bild

Schalten Sie alle Schalter ein, scrollen Sie, um alle anzuzeigen, und drücken Sie Zulassen . In der Konsole sollte folgende Meldung angezeigt werden:

 HealthKit Successfully Authorized. 

Großartig! Die Anwendung hat Zugriff auf das zentrale Repository von HealthKit. Jetzt ist es Zeit, Elemente zu verfolgen.

Eigenschaften und Proben


In diesem Abschnitt erfahren Sie:

  • So lesen Sie die biologischen Eigenschaften Ihres Benutzers.
  • Lesen und Schreiben verschiedener Arten von Proben (Gewicht, Größe usw.)

Biologische Merkmale sind in der Regel Arten von Elementen, die sich nicht ändern, genau wie Ihre Blutgruppe. Proben sind Elemente, die sich häufig ändern, z. B. das Gewicht.

Um die Effektivität des Prancercise- Trainingsmodus richtig verfolgen zu können , muss die Prancercise Tracker- App eine Stichprobe des Gewichts und der Größe des Benutzers erhalten. Zusammen können diese Proben zur Berechnung des Body Mass Index (BMI) verwendet werden.

Hinweis: Der Body Mass Index (BMI) ist ein weit verbreiteter Indikator für Körperfett und wird basierend auf dem Gewicht und der Größe einer Person berechnet. Hier erfahren Sie mehr darüber.

Spezifikationen lesen


Prancercise Tracker zeichnet keine biologischen Eigenschaften auf. Er bekommt sie von HealthKit. Dies bedeutet, dass diese Merkmale zuerst im zentralen HeathKit-Repository gespeichert werden müssen.

Wenn Sie es noch nicht getan haben, ist es Zeit, HeathKit etwas mehr über sich selbst zu erzählen.

Öffnen Sie die Health-App auf Ihrem Gerät oder Simulator. Wählen Sie die Registerkarte Gesundheitsdaten. Klicken Sie dann auf das Profilsymbol in der oberen rechten Ecke, um Ihr Gesundheitsprofil anzuzeigen. Klicken Sie auf Bearbeiten und geben Sie das Geburtsdatum, das Geschlecht und die Blutgruppe ein:

Bild

Nachdem HealthKit Ihr Geburtsdatum, Ihr Geschlecht und Ihre Blutgruppe kennt, ist es an der Zeit, diese Funktionen in Prancercise Tracker zu lesen.

Kehren Sie zu Xcode zurück und öffnen Sie ProfileDataStore.swift . Die ProfileDataStore- Klasse repräsentiert Ihren Zugriffspunkt auf alle gesundheitsbezogenen Daten für Ihre Benutzer.

Fügen Sie die folgende Methode in ProfileDataStore ein :

 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) } } 

Die Methode getAgeSexAndBloodType () ruft den HKHealthStore auf und fragt nach dem Geburtsdatum, dem Geschlecht und der Blutgruppe des Benutzers. Außerdem wird das Alter des Benutzers anhand des Geburtsdatums berechnet.

  1. Möglicherweise haben Sie bemerkt, dass diese Methode einen Fehler verursachen kann. Dies geschieht immer dann, wenn ein Geburtsdatum, ein Geschlecht oder eine Blutgruppe nicht im zentralen HealthKit-Repository gespeichert wurden. Da Sie diese Informationen gerade in Ihre Anwendung eingegeben haben, sollten Sie keine Fehler verursachen.
  2. Mit der Calendar- Klasse können Sie jedes Datum in eine Reihe von Datumskomponenten konvertieren. Dies ist sehr praktisch, wenn Sie ein Jahr für ein Date erhalten möchten. Dieser Code ermittelt nur Ihr Geburtsjahr und das aktuelle Jahr und berechnet dann die Differenz.
  3. Die "erweiterten" Variablen werden so benannt, dass klar ist, dass Sie über die Wrapper-Klasse ( HKBiologicalSexObject und HKBloodTypeObject ) auf die Basisaufzählung zugreifen müssen .

UI-Update


Wenn Sie die Anwendung jetzt kompilieren und ausführen, werden keine Änderungen in der Benutzeroberfläche angezeigt, da Sie diese Logik noch nicht damit verbunden haben.
Öffnen Sie ProfileViewController.swif t und suchen Sie die Methode loadAndDisplayAgeSexAndBloodType ( )

Diese Methode verwendet Ihren ProfileDataStore , um biologische Eigenschaften in die Benutzeroberfläche zu laden.

Fügen Sie den folgenden Code in die Methode loadAndDisplayAgeSexAndBloodType () ein :

 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) } 

Dieser Codeblock lädt Alter, Geschlecht und Blutgruppe als Tupel. Anschließend legt er diese Felder in der lokalen Instanz des UserHealthProfile-Modells fest. Schließlich wird die Benutzeroberfläche mit den neuen Feldern in UserHealthProfile aktualisiert, indem die updateLabels () -Methode aufgerufen wird.

Da die Methode getAgeSexAndBloodType () von ProfileDataStore möglicherweise einen Fehler auslöst, muss ProfileViewController diesen behandeln. In diesem Fall nehmen Sie einfach den Fehler und präsentieren ihn als Warnung.

Das alles ist großartig, aber es gibt einen Haken. Die updateLabels () -Methode führt noch nichts aus. Dies ist nur eine leere Anzeige. Lassen Sie uns dieses Mal zur Benutzeroberfläche übergehen.

Suchen Sie die updateLabels () -Methode und fügen Sie diesen Code ein:

 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 } 

Der Code ist ziemlich einfach. Wenn der Benutzer das Alter festgelegt hat, wird es in ein Etikett formatiert. Gleiches gilt für biologisches Geschlecht und Blutgruppe. Die Variable stringRepresentation konvertiert die Aufzählung zu Anzeigezwecken in eine Zeichenfolge.

Kompilieren Sie die Anwendung und führen Sie sie aus. Gehen Sie zum Bildschirm Profil & BMI. Klicken Sie auf die Schaltfläche HealthKit-Daten lesen.

Bild

Wenn Sie Ihre Informationen zuvor in die Anwendung eingegeben haben, sollten sie in den Verknüpfungen auf diesem Bildschirm angezeigt werden. Wenn Sie dies nicht getan haben, wird eine Fehlermeldung angezeigt.

Wow! Sie lesen und zeigen Daten direkt aus HealthKit an .

Abfragebeispiele


Jetzt ist es Zeit, das Gewicht und die Größe des Benutzers zu lesen. Sie werden verwendet, um den BMI zu berechnen und in der Profilansicht anzuzeigen.

Biologische Eigenschaften sind leicht verfügbar, da sie sich fast nie ändern. Proben erfordern einen viel komplexeren Ansatz. Sie verwenden HKQuery , genauer gesagt HKSampleQuery .

Um Muster von HealthKit anzufordern, benötigen Sie:

  1. Geben Sie die Art der Probe an, die Sie anfordern möchten (Gewicht, Größe usw.).
  2. Einige zusätzliche Optionen zum Filtern und Sortieren von Daten. Dazu können Sie ein optionales NSPredicate oder ein Array von NSSortDescriptors übergeben .

Hinweis: Wenn Sie mit CoreData vertraut sind, haben Sie wahrscheinlich einige Ähnlichkeiten festgestellt. HKSampleQuery ist NSFetchedRequest für einen Objekttyp sehr ähnlich, bei dem Sie die Prädikat- und Sortierdeskriptoren angeben und dann den Kontext des Objekts festlegen, um die Abfrage auszuführen und die Ergebnisse abzurufen .

Sobald Ihre Abfrage eingerichtet ist, rufen Sie einfach die HKHealthStore ExecuteQuery () -Methode auf, um die Ergebnisse abzurufen .

Für Prancercise Tracker erstellen Sie eine einzige universelle Funktion, mit der Sie die neuesten Beispiele aller Art herunterladen können. Somit können Sie es sowohl für Gewicht als auch für Größe verwenden.

Öffnen Sie ProfileDataStore.swift und fügen Sie die folgende Methode direkt unter der Methode getAgeSexAndBloodType () in die Klasse ein:

 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) } 

Diese Methode verwendet den Probentyp (Größe, Gewicht, BMI usw.). Anschließend erstellt er eine Abfrage, um das letzte Beispiel für diesen Typ abzurufen. Wenn Sie die Art der Stichprobe für das Wachstum durchgehen, kehren Sie zu Ihrem letzten Wachstumsrekord zurück.

Hier ist viel los. Ich werde aufhören, ein paar Dinge zu erklären.

  1. In HKQuery gibt es verschiedene Methoden, mit denen Sie Ihre HealthKit-Abfragebeispiele herausfiltern können. In diesem Fall verwenden wir das integrierte Datumsprädikat.
  2. Das Anfordern von Beispielen von HealthKit ist ein asynchroner Prozess. Aus diesem Grund befindet sich der Code im Completion-Handler im Dispatch-Block. Die Konformität ist für den Haupt-Thread erforderlich. Wenn Sie dies nicht tun, schlägt die Anwendung fehl.

Wenn alles gut geht, wird Ihre Anfrage ausgeführt und Sie erhalten ein ordentliches Beispiel für den Hauptthread, in dem der ProfileViewController seinen Inhalt in das Etikett einfügen kann. Lassen Sie uns diesen Teil jetzt machen.

Anzeigen von Beispielen in der Benutzeroberfläche


Im vorherigen Abschnitt haben Sie Daten von HealthKit heruntergeladen. Speichern Sie sie als Modell in ProfileViewController und aktualisieren Sie den Inhalt in Zeilen mithilfe der updateVabController- Methode updateLabels ()

Sie müssen diesen Prozess lediglich erweitern, indem Sie eine Funktion hinzufügen, die die Beispiele lädt, sie für die Benutzeroberfläche verarbeitet und dann updateLabels () aufruft , um die Beschriftungen mit Text zu füllen .

Öffnen Sie die Datei ProfileViewController.swift , suchen Sie die Methode loadAndDisplayMostRecentHeight ( ) und fügen Sie den folgenden Code ein:

 //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. Diese Methode beginnt mit der Erstellung einer Art Wachstumsprobe. Anschließend übergibt er diese Art von Beispiel an die gerade geschriebene Methode, die das zuletzt in HealthKit aufgezeichnete Beispiel für das Benutzerwachstum zurückgibt.
  2. Sobald die Stichprobe zurückkehrt, wird das Wachstum in Meter umgerechnet und im UserHealthProfile-Modell gespeichert. Dann wird die Benutzeroberfläche aktualisiert.

Hinweis: Normalerweise möchten Sie eine Mengenprobe in eine Standardeinheit umrechnen. Zu diesem Zweck verwendet der obige Code die Methode doubleValue (for :) , mit der Sie die relevanten Daten (in diesem Fall Meter) an HKUnit übergeben können .

Sie können verschiedene Arten von HKUnits mit einigen der über HealthKit verfügbaren allgemeinen Klassenmethoden erstellen . Um Zähler zu erhalten, können Sie einfach die meter () -Methode in HKUnit verwenden , und genau das benötigen Sie.

Mit Wachstum aussortiert. Wie wäre es mit dem Gewicht? Alles ist ziemlich ähnlich, aber Sie müssen die loadAndDisplayMostRecentWeight () -Methode in ProfileViewController auffüllen .

Fügen Sie den folgenden Code in die Methode loadAndDisplayMostRecentWeight () ein :

 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() } 

Sie erstellen den Typ des Beispiels, das Sie erhalten möchten, fordern HealthKit an, führen einige Einheitenumrechnungen durch, speichern es in Ihrem Modell und aktualisieren die Benutzeroberfläche.

Im Moment kann es zeigen, dass die Arbeit erledigt ist, aber es gibt noch etwas anderes. Die Funktion updateLabels () kennt die neuen Daten, die Sie ihr zur Verfügung gestellt haben, nicht.

Lass es uns reparieren.

Fügen Sie der Funktion updateLabels () direkt unter dem Teil, in dem Sie die Blutgruppe erweitern, um sie auf der Benutzeroberfläche anzuzeigen, die folgenden Zeilen hinzu :

 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) } 

Nach der ursprünglichen Vorlage in der Funktion updateLabels () werden Größe, Gewicht und Body-Mass-Index in Ihrem UserHealthProfile- Modell erweitert. Falls verfügbar, generieren sie die entsprechenden Zeilen und weisen sie Beschriftungen auf dem Bildschirm des Benutzers zu.

MassFormatter und LengthFormatter konvertieren Ihre Werte in Zeichenfolgen.

Der Body-Mass-Index wird nicht im UserHealthProfile- Modell gespeichert. Dies ist eine berechnete Eigenschaft, die die Berechnung für Sie durchführt.

Klicken Sie auf die bodyMassIndex- Eigenschaft und Sie werden sehen, was ich meine:

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

Der Body-Mass-Index ist eine optionale Eigenschaft, dh er kann null zurückgeben, wenn Sie weder Größe noch Gewicht angegeben haben (oder wenn sie auf eine Zahl festgelegt sind, die keinen Sinn ergibt). Die eigentliche Berechnung ist einfach das Gewicht geteilt durch die quadratische Höhe.

Hinweis: Bald werden Sie in all dies eintauchen, wenn Sie HealthKit keine Daten zum Lesen durch die Anwendung hinzugefügt haben . Wenn Sie dies noch nicht getan haben, müssen Sie mindestens Stichproben für Größe und Gewicht erstellen.

Öffnen Sie die Gesundheits-App und wechseln Sie zur Registerkarte Gesundheitsdaten. Wählen Sie dort den Parameter Körpermaße, dann Gewicht und dann Datenpunkt hinzufügen, um eine neue Gewichtsprobe hinzuzufügen. Wiederholen Sie den Vorgang für das Wachstum.

Zu diesem Zeitpunkt sollte der Prancercise Tracker in der Lage sein, ein aktuelles Beispiel für das Gewicht und die Größe Ihres Benutzers zu lesen und es dann im Text anzuzeigen.

Kompilieren Sie die Anwendungen und führen Sie sie aus. Gehen Sie zu Profil & BMI . Klicken Sie dann auf die Schaltfläche HealthKit-Daten lesen .

Bild

Super! Sie haben gerade Ihre ersten Proben aus dem HealthKit- Repository gelesen und sie zur Berechnung des BMI verwendet.

Proben speichern


In Prancercise Tracker hat bereits einen handlichen - Mass - Index - Rechner Körper. Lassen Sie uns damit die BMI-Stichprobe Ihres Benutzers aufzeichnen.

Öffnen Sie ProfileDataStore.swift und fügen Sie die folgende Methode hinzu:

 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") } } } 

Wie bei anderen Probentypen müssen Sie zunächst sicherstellen, dass der Probentyp in HealthKit verfügbar ist .

  1. In diesem Fall prüft der Code, ob für den Body-Mass-Index eine Mengenart vorhanden ist. Wenn ja, wird damit eine Mengenprobe erstellt. Wenn nicht, funktioniert die Anwendung nicht mehr.
  2. count() HKUnit , , . - , , .
  3. HKHealthStore , . , .

Fast fertig. Um die Benutzeroberfläche zusammenzufassen.

Öffnen Sie ProfileViewController.swif und suchen Sie die Methode saveBodyMassIndexToHealthKit ( ). Diese Methode wird aufgerufen, wenn der Benutzer in der Tabelle auf die Schaltfläche BMI speichern klickt.

Fügen Sie den folgenden Code in die Methode ein:

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

Sie erinnern sich, dass der Body-Mass-Index eine berechnete Eigenschaft ist, die einen Wert zurückgibt, wenn Stichproben für Größe und Gewicht aus HealthKit geladen werden . Dieser Code versucht, diese Eigenschaft zu berechnen. Wenn möglich, wird sie an die soeben geschriebene Methode savedBodyMassIndexSample (bodyMassIndex: date :) übergeben .

Es wird auch eine praktische Warnung angezeigt, wenn der Body-Mass-Index aus irgendeinem Grund nicht berechnet werden kann.

Kompilieren Sie die Anwendung und führen Sie sie aus. Gehen Sie zum Bildschirm Profil & BMI . Laden Sie Daten von HeathKit herunter und klicken Sie auf die Schaltfläche BMI speichern.

Schau dir die Konsole an. Siehst du es

    BMI 

Wenn ja, herzlichen Glückwunsch! Ihre BMI-Probe wird jetzt im zentralen HealthKit- Repository gespeichert . Mal sehen, ob wir ihn finden können.

Öffnen Sie die Health-App, tippen Sie auf die Registerkarte Health Data, klicken Sie in der Tabellenansicht auf Body Measurements und dann auf Body Mass Index.

Bild

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


All Articles