Introduzione a HealthKit parte 2

Nella prima parte di questo tutorial, ti ho presentato il framework HealthKit. Sulla base della mia esperienza di integrazione di HealthKit in una delle mie app, ho sottolineato alcune cose che è importante tenere a mente. Abbiamo anche iniziato a lavorare sulla nostra app di esempio, HealthBasics, che spiegherà i concetti di base del lavoro con HealthKit.

Nella prima parte, abbiamo implementato il GSHealthKitManager classe, che useremo per interagire con HealthKit. Usiamo ora il GSHealthKitManager classe per implementare la funzionalità del primo controller di visualizzazione dell'app di esempio.

1. Implementazione del controller First View

Nel Project Navigator, Aperto FirstViewController.m e sostituire il suo contenuto con il seguente:

#import "FirstViewController.h" #import "GSHealthKitManager.h" @interface FirstViewController () @property (nonatomic, weak) IBOutlet UILabel * ageLabel; @property (nonatomic, weak) IBOutlet UITextField * weightTextField; @end @implementation FirstViewController - (IBAction) healthIntegrationButtonSwitched: (UISwitch *) mittente if (sender.isOn) [[GSHealthKitManager sharedManager] requestAuthorization];  else // Eventualmente disabilitare la funzionalità HealthKit nella tua app.  - (IBAction) readAgeButtonPressed: (id) sender NSDate * birthDate = [[GSHealthKitManager sharedManager] readBirthDate]; if (birthDate == nil) // L'utente non ha impostato la data o si è verificato un errore. Semplicemente ritorna. ritorno;  NSDateComponents * ageComponents = [[NSCalendar currentCalendar] components: NSCalendarUnitYear fromDate: birthDate toDate: [Data NSDate] opzioni: 0]; self.ageLabel.text = [@ (ageComponents.year) stringValue];  - (IBAction) writeWeightButtonPressed: (id) sender [[GSHealthKitManager sharedManager] writeWeightSample: self.weightTextField.text.floatValue];  @fine 

Se si dispone di esperienza di sviluppo iOS, l'implementazione non dovrebbe essere difficile da comprendere. Nel primo controller di visualizzazione, rispondiamo all'utente che commuta l'interruttore e tocca uno dei pulsanti. Ognuna di queste interazioni innesca un metodo del GSHealthKitManager classe.

C'è una ragione per cui ho scelto di utilizzare un interruttore per chiedere il permesso dell'utente di accedere ai propri dati HealthKit. Una volta compresa l'implementazione, capirai che è una soluzione molto migliore.

È facile per l'utente capire che, quando l'interruttore è attivo, l'app si integra con HealthKit. Quando è spento, non è così. Inoltre, attivando questo interruttore per la prima volta, l'utente dovrà concedere l'accesso ai tipi di dati sanitari che l'app utilizzerà. Questa, ancora una volta, è una buona esperienza utente, perché l'utente comprende perché viene richiesto e quali benefici ottiene autorizzando l'accesso.

2. Collegamento dell'interfaccia utente

Nel Project Navigator, Aperto Main.storyboard. Nella prima scena, seleziona l'interruttore. Nel Utilità riquadro a destra, apri il Connections Inspector e, nel Eventi inviati sezione, trascinare da Valore cambiato al Primo Visualizza controller nel Struttura del documento. Dal menu a comparsa che elenca le azioni del controller della vista, selezionare healthIntegrationButtonSwitched:. Questo assicura il healthIntegrationButtonSwitched: il metodo viene chiamato ogni volta che l'interruttore viene commutato.

I passaggi per connettere il Leggere e Scrivi i pulsanti sono quasi identici. Clicca il Leggere pulsante, solo questa volta, trascinare dal Ritocca Dentro evento al First View Controller. Seleziona il readAgeButtonPressed: azione dal menu a comparsa.

Clicca il Scrivi pulsante e trascinare dal Ritocca Dentro evento al First View Controller, selezionare il writeWeightButtonPressed: metodo dal menu a comparsa.

Ora dobbiamo collegare le prese che abbiamo dichiarato agli elementi dell'interfaccia utente. stampa Controllo e trascinare da Primo Visualizza controller all'etichetta con i due punti interrogativi. Dal menu a comparsa intitolato Punti vendita, clicca su ageLabel. Questo collegherà la presa all'etichetta.

Ripeti questi passaggi per il campo di testo, collegandolo al weightTextField uscita del controller della vista.

3. Costruisci ed esegui

La prima scena dovrebbe ora essere completamente funzionante. Avvia l'app e attiva l'interruttore. Dovresti ricevere la seguente interfaccia utente delle autorizzazioni di HealthKit:

Assicurati di accendere entrambi gli interruttori prima di toccare Fatto, altrimenti la tua app non avrà accesso ai dati di cui abbiamo bisogno nell'app di esempio.

Ora puoi provare a toccare il Leggere pulsante. Se stai utilizzando l'app in iOS Simulator, probabilmente non accadrà nulla, perché non hai impostato una data di nascita. Puoi accedere all'app Salute in iOS Simulator e impostarla.

  • Apri l'app Salute.
  • Selezionare Dati sulla salute linguetta.
  • Rubinetto Me.
  • Rubinetto modificare.
  • Rubinetto Data di nascita e fissare una data. Rubinetto Fatto.

Ora puoi tornare alla nostra app HealthBasics e toccare Leggere pulsante di nuovo. Questa volta dovrebbe essere visualizzata la tua età.

Puoi anche testare la condivisione del peso. Seleziona il campo di testo del peso e inserisci un valore in chilogrammi. Dopo aver toccato Scrivi, tornate all'app Salute e, nel Dati sulla salute scheda, selezionare Misure del corpo e Peso. L'esempio che hai appena aggiunto dovrebbe essere visibile.


Finora, hai imparato le basi per lavorare con HealthKit.

  • come chiedere l'autorizzazione all'utente
  • come leggere e scrivere i dati di base
  • come incapsulare il codice relativo a HealthKit in una classe separata

4. Aggiunta di un allenamento

Nella seconda parte della nostra app di esempio, ti mostrerò come scrivere un allenamento a HealthKit. Questo è utile se stai costruendo qualsiasi tipo di allenamento (corsa, bicicletta, a piedi, ecc.). La maggior parte degli elementi costitutivi sono simili.

Passaggio 1: estensione di GSHealthKitManager Classe

Iniziamo estendendo il GSHealthKitManager classe. Aggiungere la seguente dichiarazione di metodo a GSHealthKitManager.h:

- (Void) writeWorkoutDataFromModelObject: (id) workoutModelObject;

Aggiungi un nuovo tipo di condivisione al requestAuthorizationToShareTypes: readTypes: esecuzione: metodo aggiungendo il tipo di allenamento al writeTypes schieramento.

NSArray * writeTypes = @ [[HKObjectType quantityTypeForIdentifier: HKQuantityTypeIdentifierBodyMass], [HKObjectType workoutType]];

Infine, aggiungi il writeWorkoutDataFromModelObject: metodo in fondo al GSHealthKitManager classe.

- (void) writeWorkoutDataFromModelObject: (id) workoutModelObject // In un'app per il mondo reale, si passerebbe in un oggetto modello che rappresenta i dati dell'allenamento e si selezionerebbero qui i dati rilevanti e li si passerebbe al metodo di allenamento HealthKit. // Per semplicità di questo esempio, imposteremo semplicemente dati arbitrari. NSDate * startDate = [data NSDate]; NSDate * endDate = [startDate dateByAddingTimeInterval: 60 * 60 * 2]; NSTimeInterval duration = [endDate timeIntervalSinceDate: startDate]; CGFloat distanceInMeters = 57000 .; HKQuantity * distanceQuantity = [HKQuantity quantityWithUnit: [HKUnit meterUnit] doubleValue: (double) distanceInMeters]; HKWorkout * workout = [HKWorkout workoutWithActivityType: HKWorkoutActivityTypeRunning startDate: startDate endDate: endDate duration: duration totalEnergyBurned: nil totalDistance: distanceQuantity metadata: nil]; [self.healthStore saveObject: workout withCompletion: ^ (successo BOOL, errore NSError *) NSLog (@ "Salvataggio allenamento in healthStore - successo:% @", successo? @ "SÌ": @ "NO"); if (error! = nil) NSLog (@ "error:% @", errore); ]; 

Nella mia app, Routie, ho usato l'approccio di passare un oggetto modello a writeWorkoutDataFromModelObject: metodo, delegando il sollevamento pesante alla classe manager. Quest'ultimo preleva i dati richiesti dall'oggetto del modello e passa le informazioni al HKHealthStore esempio. Credo che sia un buon approccio per mantenere limitato il codice relativo a HealthKit nella classe manager.

L'implementazione del writeWorkoutDataFromModelObject: il metodo è piuttosto semplice. Ci sono solo tre passaggi:

  1. Per prima cosa prepariamo i dati. In questo esempio, stiamo facendo i numeri.
  2. Quindi creiamo a HKWorkout oggetto invocando uno degli inizializzatori di convenienza della classe.
  3. Finalmente, salviamo il HKWorkout oggetto al HKHealthStore esempio.

Questa è la prima volta che lavoriamo con la classe HKWorkout, quindi permettimi di introdurre brevemente questa classe. Il framework HealthKit utilizza il HKWorkout classe per tenere traccia delle attività. Gli allenamenti sono per lo più immutabili, quindi devi fornire i valori dell'allenamento durante l'inizializzazione.

Durante l'inizializzazione di un allenamento, è necessario fornire un tipo di attività, una data di inizio e una data di fine. Puoi opzionalmente passare in totale distanza, energia totale bruciata e metadati. I metadati possono essere utilizzati per assegnare ulteriori informazioni all'allenamento. Questo è davvero utile quando vuoi condividere più informazioni su un allenamento con un'applicazione diversa che hai anche creato.

Passaggio 2: implementazione di writeWorkoutButtonPressed: Azione

Aperto SecondViewController.m e aggiungi la seguente importazione all'inizio del file:

#import "GSHealthKitManager.h"

Quindi, implementare il writeWorkoutButtonPressed: metodo come mostrato di seguito.

- (IBAction) writeWorkoutButtonPressed: (id) sender // In un'app per il mondo reale, si otterrebbe un riferimento a un oggetto modello pertinente e lo si passerebbe al metodo seguente. [[GSHealthKitManager sharedManager] requestAuthorization]; [[GSHealthKitManager sharedManager] writeWorkoutDataFromModelObject: nil]; 

Passaggio 3: creazione dell'interfaccia utente di allenamento

Aggiungeremo un singolo pulsante alla seconda scena dell'app per scrivere l'allenamento. Aperto Main.storyboard e concentrati sulla seconda scena. Elimina le etichette che sono attualmente in Second View Controller.

Aggiungi un pulsante al centro della vista del controller della vista e impostane il titolo Scrivi allenamento. Connetti il ​​suo Ritocca Dentro evento al writeWorkoutButtonPressed: azione che abbiamo implementato nel passaggio precedente.

5. Test

Crea ed esegui l'applicazione e imposta l'interruttore Integrazione integrità su attivo. Il Accesso alla salute lo schermo verrà presentato con il tipo di allenamento appena richiesto disattivato. Accendilo e tocca Fatto. Questo è necessario solo perché abbiamo aggiunto il tipo di condivisione allenamento all'elenco dei tipi di condivisione. Ciò significa che dobbiamo chiedere l'autorizzazione all'utente prima di utilizzarlo.

Apri la seconda scheda in basso e tocca Scrivi allenamento. Se tutto è andato bene, dovresti vedere il seguente messaggio nella Console di Xcode:

Salvataggio dell'allenamento in healthStore - successo: SÌ

Ora puoi passare all'app Salute e andare a Dati sulla salute > Fitness > allenamenti. Lì dovresti vedere l'allenamento che è stato appena aggiunto.

Conclusione

In questo tutorial, ti ho mostrato come puoi scrivere un allenamento a HealthKit. Ti ho anche mostrato come separare il codice relativo a HealthKit passando un oggetto modello al metodo che scrive l'allenamento su HealthKit.

Spero che questo tutorial ti sia piaciuto e che tu abbia imparato tutte le basi necessarie per andare là fuori e integrare la tua app con HealthKit. Spero anche che ti abbia convinto a provare HealthKit.

Fammi sapere nei commenti come ti è piaciuto questo tutorial o se qualcosa non era chiaro. Puoi anche trovarmi su Twitter.

link

L'elenco che segue include una serie di link pertinenti in modo da poter passare rapidamente a ciò di cui hai bisogno:

  • Riferimento a HealthKit Framework di Apple: consiglio vivamente di leggerlo.
  • Adatta: salva e recupera i dati HealthKit: esempio di applicazione HealthKit fornita da Apple
  • Linee guida per la recensione di App Store - HealthKit: la sezione delle linee guida per la revisione di App Store relativa a HealthKit
  • Presentazione di HealthKit (video di sessione WWDC 2014)
  • Novità di HealthKit (video delle sessioni del WWDC 2015)