Komma igång med HealthKit Del 1

HealthKit-ramverket introducerades förra året på WWDC 2014 som en enda plats där appar kan lagra, dela och läsa hälsorelaterade data. Den nya Health appen, som är användarens syn på data, var ett av flaggskeppsfunktionerna i IOS 8.

En av de främsta fördelarna med HealthKit är att fitness och hälsorelaterade appar enkelt kan dela data med varandra. Under det gångna året har många utvecklare godkänt HealthKit i sina appar och tekniskt kunniga användare har kommit att förvänta sig att någon fitnessapp integreras med HealthKit.

Det finns många fördelar, gotchas och bästa praxis när man arbetar med denna nya och spännande ram. Nyligen har jag haft förstahandsupplevelse som arbetar med HealthKit-ramen när jag lägger till support för HealthKit till en av mina appar, Routie. Om du funderar på att använda HealthKit i din egen app, så är denna handledning för dig.

Varför ska jag bry sig om HealthKit?

Jag har redan nämnt några av fördelarna med HealthKit, men om du inte säljs än, låt mig bara säga att det inte är så svårt att integrera HealthKit. Jag skulle till och med gå vidare och säga att det är lättare än de flesta andra nya ramar som Apple introducerade. Självklart beror detta mycket på vad du vill uppnå med det. Men i allmänhet skulle jag säga att förhållandet mellan det arbete som krävs för att integrera HealthKit och de fördelar som det ger till dina användare är väldigt gynnsamt.

Förutom den enkla integrationen i befintliga appar, ger det också möjlighet att bygga helt ny kategori av appar. Till exempel kan du dra olika data från HealthKit, som användarens träningspass eller blodtryck, och visa dem på ett intressant sätt, vilket gör det svårt att samla in data till andra appar.

Vad lär du dig?

Mitt mål med denna handledning är att lära dig grunderna genom att bygga en provapp. Dessutom kommer jag att ge dig ett antal användbara tips och knep om hur du kan eller ska integrera HealthKit i dina egna appar. Efter att ha läst den här artikeln borde du ha en grundläggande förståelse för HealthKit, redo att använda den i dina appar.

Vad du borde veta

Följande lista innehåller ett antal grundläggande fakta om HealthKit som du borde vara medveten om:

  • HealthKit-ramen finns tillgänglig sedan iOS 8. Observera att den endast är tillgänglig på iPhone, inte iPad.
  • Apple är allvarligt om integritet och därför måste du uttryckligen begära att du läser och / eller skriver till HealthKit för varje datatyp du behöver ha tillgång till. Användaren har möjlighet att tillåta åtkomst för vissa typer och förneka det för andra.
  • HealthKit-ramen gör stor användning av underklassen.
  • Det finns två huvuddatatyper, egenskaper och prover. Egenskaper, som användarens födelsedatum eller blodtyp, ändras vanligen inte. Prov representerar data vid en viss tidpunkt.
  • Mängderprover är de vanligaste datatyperna. De inkluderar användarens höjd och vikt, steg, användarens temperatur, puls, etc..
  • träning, som tillhör provkategori, är avsedda för att representera körningar, promenader, åkattraktioner mm.

För mer information om HealthKit-ramverket, besök Apples HealthKit Framework Reference.

Innan vi börjar

Jag vet att du förmodligen är ivrig att börja med provprojektet, men det finns några viktiga saker som du bör vara medveten om innan du dyker in.

  • HealthKit-butiken är krypterad när användarens telefon är låst. Det betyder att du inte kommer att kunna läsa av det när din app finns i bakgrunden. Att skriva till HealthKit fungerar dock även när telefonen är låst.
  • Du måste förklara i din App Store beskrivning och i din app hur din app ska använda data som erhållits från HealthKit. Underlåtenhet att göra det kan leda till avslag på din app.
  • Det finns en ny sektion i App Store granskningsriktlinjer som täcker HealthKit. Du bör definitivt läsa igenom det innan du bestämmer om du vill lägga till support för HealthKit eller inte.
  • När din app integreras med HealthKit måste du ange en sekretesspolicy för den. Apple rekommenderar även vissa dokument som anger vilka hälsoprelaterade sekretesspolicyer som ska se ut. Det är viktigt att sekretesspolicy berättar användaren hur din app behandlar deras data.

Nu när vi fick det ur vägen, låt oss börja med handledningen.

Projektet

Vi kommer att bygga en enkel app som integrerar med HealthKit och förklarar några av de grundläggande begreppen i ramen. I synnerhet kommer vi att

  • skapa ett nytt projekt från början och aktivera HealthKit
  • fråga användarens tillstånd att få tillgång till deras hälsorelaterade uppgifter
  • läs användarens födelsedatum
  • skriv ett viktprov till HealthKit
  • skriv ett träningspass till HealthKit

1. Ställa in projektet

Starta Xcode och välj Fil > Ny > Projekt… Från iOS> Application avsnitt, välj Tabbed Application mall och klicka Nästa.

Stiga på HealthBasics som projektets produktnamn och klicka Nästa. Välj var du vill spara projektet och klicka på Skapa.

2. Aktivera HealthKit

I Project Navigator till vänster, klicka på projektet, välj HealthBasics mål och öppna Förmågor fliken längst upp. Bläddra ner till HealthKit avsnitt och aktivera HealthKit växla omkopplaren till höger. Bakom kulisserna kommer Xcode att göra det nödvändiga för att du ska kunna aktivera HealthKit.


3. Skapa användargränssnittet

För detta projekt använder vi inte storleksklasser. Eftersom storleksklasserna är aktiverade som standard måste vi manuellt inaktivera dem i Xcode. I Project Navigator till vänster, välj Main.storyboard. Öppna Filinspektör till höger och avmarkera kryssrutan märkt Använd storleksklasser.

Xcode visar dig en varningsdialog. Avvisa det genom att klicka på Inaktivera storleksklasser, men gör för att behålla storleksklassdata för iPhone enligt nedanstående.


Ta bort de två etiketterna i First View Controller. Dra sedan en etikett och en omkopplare från Objektbibliotek till höger på First View Controller. Ändra etikettens text till Integration av hälsa och ställ omkopplarens tillstånd till av.

Lägg till ytterligare två etiketter och en knapp till First View Controller. Ändra den första etikettens text till Användarens ålder: Ändra den andra etikettens text till ??, och justera dem horisontellt enligt bilden nedan. Ändra ändå knappens titel till Läsa och placera den till höger om den andra etiketten. Den första scenen ska nu se ut så här:

Vi är inte färdiga än. Lägg till en annan etikett, ett textfält och en knapp till förstavyskontrollen, anpassa dem horisontellt enligt nedan. Ändra etikettens text till Användarens vikt: och ändra knappens titel till Skriva.

Markera det textfält du just har lagt till och i Attribut Inspector, ändra dess Tangentbordstyp till Numbers and Punctuation. Det är allt. Den första scenen ska nu se ut så här:

4. Skapa HealthKit Manager

Vi kommer att hålla HealthKit-relaterad kod i en separat klass, the GSHealthKitManager klass. Låt oss skapa den klassen nu.

I Project Navigator, högerklicka på HealthBasics grupp och välj Ny fil… . Se till Kakao Touch Class väljs från listan med mallar och klickar på Nästa. Namnge klassen GSHealthKitManager och klicka Nästa.

Öppna huvudfilen till GSHealthKitManager klass och ersätt filens innehåll med följande kod. Senare kommer vi att ringa dessa metoder från FirstViewController klass.

#importera  @interface GSHealthKitManager: NSObject + (GSHealthKitManager *) sharedManager; - (tom) begäranAuthorization; - (NSDate *) readBirthDate; - (void) writeWeightSample: (CGFloat) vikt; @slutet

Därefter öppnar du implementeringsfilen för GSHealthKitManager klass och ersätt dess innehåll med följande:

#import "GSHealthKitManager.h" #import  @interface GSHealthKitManager () @property (nonatomic, behåll) HKHealthStore * healthStore; @end @implementation GSHealthKitManager + (GSHealthKitManager *) sharedManager static dispatch_once_t pred = 0; statisk GSHealthKitManager * instans = nil; dispatch_once (& pred, ^ instance = [[GSHealthKitManager alloker] init]; instance.healthStore = [[HKHealthStore alloc] init];); returnera instans  - (void) requestAuthorization if ([HKHealthStore isHealthDataAvailable] == NO) // Om vår enhet inte stöder HealthKit -> returnera. lämna tillbaka;  NSArray * readTypes = @ [[HKObjectType characteristicTypeForIdentifier: HKCharacteristicTypeIdentifierDateOfBirth]]; NSArray * writeTypes = @ [[HKObjectType quantityTypeForIdentifier: HKQuantityTypeIdentifierBodyMass]]; [self.healthStore requestAuthorizationToShareTypes: [NSSet setWithArray: readTypes] readTypes: [NSSet setWithArray: writeTypes] completion: nil];  - (NSDate *) readBirthDate NSError * error; NSDate * dateOfBirth = [self.healthStore dateOfBirthWithError: & error]; // HKHealthStore bekvämmetod för att få födelsedatum direkt. om (! dateOfBirth) NSLog (@ "Antingen har ett fel inträffat för att hämta användarens åldersinformation, eller ingen har lagrats än. I din app försök att hantera detta graciöst.");  returdatumOfBirth;  - (void) writeWeightSample: (CGFloat) vikt // Varje kvantitet består av ett värde och en enhet. HKUnit * kilogramUnit = [HKUnit gramUnitWithMetricPrefix: HKMetricPrefixKilo]; HKQuantity * weightQuantity = [HKQuantity quantityWithUnit: kilogramUnit doubleValue: vikt]; HKQuantityType * weightType = [HKQuantityType quantityTypeForIdentifier: HKQuantityTypeIdentifierBodyMass]; NSDate * nu = [NSDate date]; // För varje prov behöver vi en provtyp, kvantitet och datum. HKQuantitySample * weightSample = [HKQuantitySample quantitySampleWithType: weightType kvantitet: weightQuantity startDate: now endDate: now]; [self.healthStore saveObject: weightSample withCompletion: ^ (BOOL-framgång, NSError * -fel) if (! success) NSLog (@ "Fel vid viktminskning (% f) till Health Store:% @.", vikt, fel) ; ];  @slutet

Medan det mesta av HealthKit-koden är lätt att förstå, låt oss gå över varje metod för att se till att vi är på samma sida.

  • sharedManager är en klassmetod som skapar singleton-objektet första gången det heter, och returnerar den förekomsten varje gång metoden åberopas. De dispatch_once funktionen är en GCD (Grand Central Dispatch) funktion som garanterar att blocket som skickas till det kallas endast en gång, även om sharedManager Metoden skulle kallas från flera trådar samtidigt.
  • requestAuthorization är en metod som frågar HealthKit-butiken för behörigheter att läsa och / eller skriva de specifika uppgifter som vi behöver. Du måste ringa den här metoden innan du använder någon av de skrivande / läsande API: erna för HKHealthStore klass. Om användaren nekar vissa (eller alla) behörigheter, informerar HealthKit dig inte om det. Det faktum att användaren inte vill dela vissa typer av data är information i sig. Det är så mycket Apple bryr sig om integritet.
  • De readBirthDate Metoden returnerar användarens födelsedatum. Det återkommer noll om det uppstod ett fel eller om användaren inte har angivit ett födelsedatum.
  • writeWeightSample: sparar en viktmätning till HealthKit. Jag har kommenterat koden så att du borde ha en allmän uppfattning om vad som händer i metoden. När vi har HKQuantitySample objekt, vi sparar det till HKHealthStore exempel med hjälp av dess saveObject: withCompletion: metod. Denna metod används för alla typer av hälsodata och vi kommer också använda den i den andra delen av denna handledning när du sparar träning.

I det här steget mötte du ett antal HealthKit-klasser. Du kan läsa mer om varje klass i HealthKit Framework Reference, men jag ger dig en kort sammanfattning av varje klass.

  • HKHealthStore Detta är ditt fönster till HealthKit data. Apple rekommenderar att du använder bara en förekomst av den här klassen i din app och som egentligen låter dig singleton mönstret. Du använder den för att fråga användaren om behörigheter, spara prover och / eller träningspass till HealthKit och fråga efter lagrade data. Dessa är bara några av uppgifterna i HKHealthStore klass.
  • HKUnit Instanser av denna klass kan representera antingen grundläggande enheter, såsom meter, sekunder och gram, eller komplexa enheter som skapas genom att kombinera grundläggande enheter, såsom km / h eller eller g / m³. Komplexa enheter kan enkelt skapas från strängar.
  • HKQuantity Instanser av denna klassaffär ett värde (representerat av dubbel) för en given enhet (representerad av HKUnit). Du kan använda doubleValueForUnit: metod för att omvandla kvantitetens värde till den enhet som passerat in. Ett exempel på en sådan omvandling skulle skapa avståndsmängd med enhetsenhet och ber om värdet i fötterna.
  • HKQuantityType HealthKit använder kvanttyper för att skapa prover som lagrar ett numeriskt värde. Det rekommenderas att använda quantityTypeForIdentifier: när du skapar kvantitetstyper. Några exempel på kvantitetstyper är cykeldistrikt, energiförbränning, steg och flygningar klättrade.
  • HKQuantitySample En förekomst av denna klass representerar ett prov som har en kvantitetstyp (representerad av HKQuantityType), en kvantitet (representerad av HKQuantity) och ett start- och slutdatum. Om provet inte spänner över en tidsperiod, kan slutdatumet vara detsamma som startdatumet.

Vi kan nu använda GSHealthKitManager singleton från var som helst i vår ansökan för att arbeta med HealthKit.

Slutsats

I denna handledning lärde du dig om grunderna i HealthKit-ramen. Jag har introducerat dig till ramverket och påpekade några av försiktigheterna att se upp för. Vi har också byggt grunden för provappen och implementerat GSHealthKitManager klass, som vi ska använda för att interagera med HealthKit.

I den andra delen av denna serie fortsätter vi att bygga provappen och integrera HealthKit ytterligare. Du kan hitta källfilerna för denna handledning på GitHub.