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.
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.
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.
Följande lista innehåller ett antal grundläggande fakta om HealthKit som du borde vara medveten om:
För mer information om HealthKit-ramverket, besök Apples HealthKit Framework Reference.
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.
Nu när vi fick det ur vägen, låt oss börja med handledningen.
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
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.
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.
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:
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.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.
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.