Il framework HealthKit è stato introdotto l'anno scorso al WWDC 2014 come un unico luogo in cui le app possono archiviare, condividere e leggere i dati relativi alla salute. La nuova app Salute, che è la vista dell'utente in quei dati, era una delle caratteristiche di punta di iOS 8.
Uno dei principali vantaggi di HealthKit è che le app per il fitness e la salute possono condividere facilmente i dati tra loro. Durante lo scorso anno, molti sviluppatori hanno adottato HealthKit nelle loro app e gli utenti esperti di tecnologia si sono aspettati che qualsiasi app per il fitness si integrasse con HealthKit.
Ci sono molti vantaggi, trucchi e buone pratiche quando si lavora con questo nuovo ed entusiasmante framework. Recentemente, ho avuto un'esperienza di prima mano lavorando con il framework HealthKit quando aggiungo il supporto per HealthKit a una delle mie app, Routie. Se stai pensando di utilizzare HealthKit nella tua app, questo tutorial è per te.
Ho già menzionato alcuni dei benefici di HealthKit, ma se non lo hai ancora venduto, lasciami solo dire che non è davvero così difficile integrare HealthKit. Andrei anche oltre e direi che è più facile della maggior parte degli altri nuovi framework introdotti da Apple. Ovviamente, ciò dipende in gran parte da ciò che si vuole ottenere con esso. Ma in generale, direi che il rapporto tra lo sforzo necessario per integrare HealthKit ei vantaggi che offre ai tuoi utenti è molto favorevole.
Oltre alla semplice integrazione con le app esistenti, offre anche la possibilità di creare una categoria di app completamente nuova. Ad esempio, puoi estrarre vari dati da HealthKit, ad esempio gli allenamenti o la pressione sanguigna dell'utente, e visualizzarli in un modo interessante, lasciando il duro lavoro di raccogliere quei dati in altre app.
Il mio obiettivo con questo tutorial è di insegnarti le basi costruendo un'app di esempio. Inoltre, ti darò una serie di consigli e trucchi utili su come potresti o dovresti integrare HealthKit nelle tue app. Dopo aver letto questo articolo, dovresti avere una conoscenza di base di HealthKit, pronto per usarlo nelle tue app.
Il seguente elenco include una serie di informazioni di base su HealthKit di cui è necessario essere a conoscenza:
Per ulteriori informazioni sul framework HealthKit, visitare il riferimento del framework HealthKit di Apple.
So che probabilmente sei ansioso di iniziare con il progetto di esempio, ma ci sono alcune cose importanti di cui dovresti essere a conoscenza prima di immergerti.
Ora che lo abbiamo tolto, iniziamo con il tutorial.
Costruiremo una semplice app che si integra con HealthKit e spiega alcuni dei concetti di base del framework. In particolare, noi:
Avvia Xcode e seleziona File > Nuovo > Progetto… Dal iOS> Applicazione sezione, selezionare il Applicazione a schede modello e clicca Il prossimo.
accedere HealthBasics come del progetto nome del prodotto e fare clic Il prossimo. Seleziona dove vuoi salvare il progetto e clicca Creare.
Nel Project Navigator a sinistra, fare clic sul progetto, selezionare il HealthBasics bersaglio, e aprire il funzionalità scheda in alto. Scorri verso il basso fino a HealthKit sezione e consentire a HealthKit di attivare lo switch a destra. Dietro le quinte, Xcode farà il necessario per abilitare HealthKit.
Per questo progetto, non useremo le classi di dimensioni. Poiché le classi di dimensioni sono abilitate per impostazione predefinita, è necessario disabilitarle manualmente in Xcode. Nel Project Navigator a sinistra, seleziona Main.storyboard. Apri il File Inspector a destra e deseleziona la casella di controllo Usa classi di dimensioni.
Xcode ti mostrerà una finestra di avviso. Eliminalo cliccando Disabilita classi di dimensioni, ma fare per mantenere i dati della classe di dimensione per i phone come mostrato di seguito.
Rimuovere le due etichette nel First View Controller. Quindi, trascina un'etichetta e un interruttore da Libreria di oggetti a destra sul controller First View. Cambia il testo dell'etichetta in Integrazione sanitaria e impostare lo stato del passaggio su via.
Aggiungi altre due etichette e un pulsante a First View Controller. Cambia il testo della prima etichetta in Età dell'utente:, cambia il testo della seconda etichetta in ??, e allinearli orizzontalmente come mostrato nell'immagine sottostante. Infine, cambia il titolo del pulsante in Leggere e posizionarlo a destra della seconda etichetta. La prima scena dovrebbe ora assomigliare a questa:
Non abbiamo ancora finito. Aggiungi un'altra etichetta, un campo di testo e un pulsante al primo controller di visualizzazione, allineandoli orizzontalmente come mostrato di seguito. Cambia il testo dell'etichetta in Peso dell'utente: e cambia il titolo del pulsante in Scrivi.
Seleziona il campo di testo che hai appena aggiunto e, nel Ispettore degli attributi, cambiala Tipo di tastiera a Numeri e punteggiatura. Questo è tutto. La prima scena dovrebbe ora assomigliare a questa:
Stiamo andando a mantenere il codice relativo a HealthKit in una classe separata, il GSHealthKitManager
classe. Creiamo quella classe ora.
Nel Project Navigator, fare clic con il tasto destro del mouse su HealthBasics raggruppa e seleziona Nuovo file… . Assicurarsi Cocoa Touch Class è selezionato dall'elenco di modelli e fare clic Il prossimo. Dai un nome alla classe GSHealthKitManager e fare clic Il prossimo.
Apri il file di intestazione del file GSHealthKitManager
classe e sostituire il contenuto del file con il seguente codice. Più tardi, chiameremo questi metodi dal FirstViewController
classe.
#importare@interface GSHealthKitManager: NSObject + (GSHealthKitManager *) sharedManager; - (void) requestAuthorization; - (NSDate *) readBirthDate; - (void) writeWeightSample: (CGFloat) peso; @fine
Successivamente, ope il file di implementazione di GSHealthKitManager
classe e sostituire il suo contenuto con il seguente:
#import "GSHealthKitManager.h" #import@interface GSHealthKitManager () @property (nonatomic, retain) HKHealthStore * healthStore; @end @implementation GSHealthKitManager + (GSHealthKitManager *) sharedManager static dispatch_once_t pred = 0; statico GSHealthKitManager * instance = nil; dispatch_once (& pred, ^ instance = [[GSHealthKitManager alloc] init]; instance.healthStore = [[HKHealthStore alloc] init];); restituire istanza; - (void) requestAuthorization if ([HKHealthStore isHealthDataAvailable] == NO) // Se il nostro dispositivo non supporta HealthKit -> return. ritorno; NSArray * readTypes = @ [[HKObjectType characteristicTypeForIdentifier: HKCharacteristicTypeIdentifierDateOfBirth]]; NSArray * writeTypes = @ [[HKObjectType quantityTypeForIdentifier: HKQuantityTypeIdentifierBodyMass]]; [self.healthStore requestAuthorizationToShareTypes: [NSSet setWithArray: readTypes] readTypes: [NSSet setWithArray: writeTypes] completamento: nil]; - Errore (NSDate *) readBirthDate NSError *; NSDate * dateOfBirth = [self.healthStore dateOfBirthWithError: & error]; // Metodo di convenienza di HKHealthStore per ottenere direttamente la data di nascita. if (! dateOfBirth) NSLog (@ "Si è verificato un errore durante il recupero delle informazioni sull'età dell'utente o nessuna è stata ancora archiviata. Nella tua app, prova a gestirlo con garbo."); return dateOfBirth; - (void) writeWeightSample: (CGFloat) weight // Ogni quantità consiste in un valore e un'unità. HKUnit * kilogramUnit = [HKUnit gramUnitWithMetricPrefix: HKMetricPrefixKilo]; HKQuantity * weightQuantity = [HKQuantity quantityWithUnit: kilogramUnit doubleValue: weight]; HKQuantityType * weightType = [HKQuantityType quantityTypeForIdentifier: HKQuantityTypeIdentifierBodyMass]; NSDate * now = [Data NSDate]; // Per ogni campione, abbiamo bisogno di un tipo di campione, quantità e una data. HKQuantitySample * weightSample = [HKQuantitySample quantitySampleWithType: weightType quantity: weightQuantity startDate: now endDate: now]; [self.healthStore saveObject: weightSample withCompletion: ^ (errore BOOL, NSError * error) if (! successo) NSLog (@ "Errore durante il salvataggio del peso (% f) in Health Store:% @.", peso, errore) ; ]; @fine
Mentre la maggior parte del codice relativo a HealthKit è abbastanza semplice da comprendere, esaminiamo ciascun metodo per assicurarci di essere sulla stessa pagina.
sharedManager
è un metodo di classe che crea l'oggetto singleton la prima volta che viene chiamato e restituisce quell'istanza ogni volta che viene richiamato il metodo. Il dispatch_once
la funzione è una funzione GCD (Grand Central Dispatch) che garantisce che il blocco passato viene chiamato una sola volta, anche se il sharedManager
il metodo verrebbe richiamato da più thread contemporaneamente.requestAuthorization
è un metodo che richiede all'archivio di HealthKit le autorizzazioni per leggere e / o scrivere i dati specifici di cui abbiamo bisogno. È necessario chiamare questo metodo prima di utilizzare una delle API di scrittura / lettura di HKHealthStore
classe. Nel caso in cui l'utente neghi alcune (o tutte) autorizzazioni, HealthKit non ti informerà di questo. Il fatto che l'utente non voglia condividere alcuni tipi di dati è un'informazione in sé. Questo è quanto Apple tiene alla privacy.readBirthDate
metodo restituisce la data di nascita dell'utente. Torna zero
se c'è stato un errore o se l'utente non ha inserito una data di nascita.writeWeightSample:
salva una misurazione del peso in HealthKit. Ho commentato il codice quindi dovresti avere un'idea generale di cosa sta succedendo nel metodo. Una volta che abbiamo il HKQuantitySample
oggetto, lo salviamo nel HKHealthStore
esempio, usando il suo saveObject: withCompletion:
metodo. Questo metodo viene utilizzato per ogni tipo di dati sulla salute e lo utilizzeremo anche nella seconda parte di questo tutorial quando si salvano gli allenamenti.In questo passaggio, hai incontrato un certo numero di classi HealthKit. Puoi leggere ulteriori informazioni su ogni classe nel riferimento del framework HealthKit, ma ti fornirò un breve riepilogo di ogni classe.
HKHealthStore
Questa è la tua finestra per i dati di HealthKit. Apple consiglia di utilizzare solo un'istanza di questa classe nella tua app e che si presta molto bene al modello singleton. Lo si utilizza per chiedere all'utente autorizzazioni, salvare campioni e / o allenamenti su HealthKit e interrogare i dati memorizzati. Questi sono solo alcuni dei compiti del HKHealthStore
classe.HKUnit
Le istanze di questa classe possono rappresentare unità di base, come metri, secondi e grammi o unità complesse create combinando unità di base, come km / ho o g / m³. Le unità complesse possono essere convenientemente create da stringhe.HKQuantity
Le istanze di questa classe memorizzano un valore (rappresentato da doppio) per una data unità (rappresentato da HKUnit
). Puoi usare il doubleValueForUnit:
metodo per convertire il valore della quantità nell'unità che è passata. Un esempio di tale conversione sarebbe la creazione di una quantità di distanza con unità di metri e la richiesta del suo valore in piedi.HKQuantityType
HealthKit utilizza i tipi di quantità per creare campioni che memorizzano un valore numerico. Si consiglia di usare quantityTypeForIdentifier:
quando si creano tipi di quantità. Alcuni esempi di tipi di quantità sono la distanza ciclistica, energia bruciata, passi e voli saliti.HKQuantitySample
Un'istanza di questa classe rappresenta un esempio che ha un tipo di quantità (rappresentato da HKQuantityType
), una quantità (rappresentata da HKQuantity
) e una data di inizio e fine. Nel caso in cui il campione non si estende su un periodo di tempo, la data di fine può essere uguale alla data di inizio.Ora possiamo usare il GSHealthKitManager
singleton da qualsiasi punto della nostra applicazione per lavorare con HealthKit.
In questo tutorial, hai imparato le basi del framework HealthKit. Ti ho presentato al framework e ho indicato alcuni dei caveat a cui prestare attenzione. Abbiamo anche costruito le basi dell'applicazione di esempio e implementato il GSHealthKitManager
classe, che useremo per interagire con HealthKit.
Nella seconda parte di questa serie, continueremo a creare l'app di esempio e ad integrare ulteriormente HealthKit. Puoi trovare i file sorgente per questo tutorial su GitHub.