I den första delen av denna handledning introducerade jag dig till HealthKit-ramen. Baserat på min egen erfarenhet av att integrera HealthKit i en av mina appar har jag påpekat några saker som är viktiga att tänka på. Vi har också börjat jobba med vår provapp, HealthBasics, som kommer att förklara de grundläggande begreppen att arbeta med HealthKit.
I den första delen genomförde vi GSHealthKitManager
klass, som vi ska använda för att interagera med HealthKit. Låt oss nu använda GSHealthKitManager
klass för att implementera funktionaliteten för den första visningsstyrenheten i provappen.
I Project Navigator, öppna FirstViewController.m och ersätt dess innehåll med följande:
#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 *) avsändare if (sender.isOn) [[GSHealthKitManager sharedManager] requestAuthorization]; else // Möjligen inaktivera HealthKit-funktionaliteten i din app. - (IBAction) readAgeButtonPressed: (id) avsändare NSDate * birthDate = [[GSHealthKitManager sharedManager] readBirthDate]; om (birthDate == nil) // Endera användaren ställde inte in datumet eller ett fel inträffade. Helt enkelt återvända. lämna tillbaka; NSDateComponents * ageComponents = [[NSCalendar currentCalendar] komponenter: NSCalendarUnitYear fromDate: birthDate toDate: [NSDate date] options: 0]; self.ageLabel.text = [@ (ageComponents.year) stringValue]; - (IBAction) writeWeightButtonPressed: (id) avsändare [[GSHealthKitManager sharedManager] writeWeightSample: self.weightTextField.text.floatValue]; @slutet
Om du har någon IOS-utvecklingserfarenhet, bör implementeringen inte vara svår att förstå. I den första bildkontrollen svarar vi på användaren att växla omkopplaren och knackar på en av knapparna. Var och en av dessa växelverkan utlöser en metod av GSHealthKitManager
klass.
Det finns en anledning till att jag har valt att använda en växel för att fråga användarens tillstånd att komma åt deras HealthKit-data. När du förstår implementeringen förstår du att det är en mycket bättre lösning.
Det är lätt för användaren att förstå att när appen är på, integrerar appen med HealthKit. När det är avstått, gör det inte. Förutom att den första gången du slår på den här omkopplaren, uppmanar användaren att ge tillgång till de hälsodatatyper som appen ska använda. Detta är igen en bra användarupplevelse, eftersom användaren förstår varför hon uppmanas och vilka fördelar hon får genom att tillåta åtkomst.
I Project Navigator, öppna Main.storyboard. I den första scenen väljer du omkopplaren. I verktyg ruta till höger, öppna Anslutningsinspektör och i Skickade händelser avsnitt, dra från Värde ändrats till Först Visa kontrollenhet i Dokumentbeskrivning. På den popup-meny som listar åtgärderna för visningskontrollen, välj healthIntegrationButtonSwitched:
. Detta garanterar healthIntegrationButtonSwitched:
Metoden heter närhelst växeln växlas.
Stegen för att ansluta Läsa och Skriva knapparna är nästan identiska. Klicka på Läsa knappen, bara den här tiden, dra från Touch Up Inside händelse till First View Controller. Välj readAgeButtonPressed:
åtgärd från popup-menyn.
Klicka på Skriva knappen och dra från Touch Up Inside händelse till First View Controller, välj writeWeightButtonPressed:
metod från popup-menyn.
Vi behöver nu ansluta de uttag som vi deklarerade till användargränssnittet. Tryck Kontrollera och dra från Först Visa kontrollenhet till etiketten med de två frågorna. Från popup-menyn med titeln utlopp, Klicka på ageLabel
. Detta kommer att ansluta uttaget till etiketten.
Upprepa dessa steg för textfältet och anslut det till weightTextField
Utsikt av visningsregulatorn.
Den första scenen ska nu vara fullt fungerande. Starta appen och sätt på strömbrytaren. Du bör uppmanas med följande användargränssnitt för HealthKit-behörigheter:
Se till att båda strömbrytarna slås på innan du trycker på Gjort, annars har din app inte tillgång till de data vi behöver i appen.
Du kan nu försöka knacka på Läsa knapp. Om du kör appen i iOS-simulatorn kommer förmodligen ingenting att hända, eftersom du inte har angett ett födelsedatum. Du kan gå vidare till Health-appen i iOS-simulatorn och ställa in den.
Du kan nu gå tillbaka till vår HealthBasics app och knacka på Läsa knappen igen. Den här gången bör din ålder visas.
Du kan också testa viktdelning. Markera vikttextfältet och ange ett värde i kilogram. När du har tryckt på Skriva, gå tillbaka till Health app och, i Hälso data fliken, välj Kroppsmätningar och Vikt. Det prov du just lagt till ska vara synligt.
Hittills har du lärt dig grunderna i att arbeta med HealthKit.
I den andra delen av vår provapp kommer jag att visa dig hur du skriver ett träningspass till HealthKit. Det här är användbart om du bygger någon form av träning (kör, cykla, gå, etc.). De flesta byggstenar är likartade.
GSHealthKitManager
KlassVi börjar med att förlänga GSHealthKitManager
klass. Lägg till följande metoddeklaration till GSHealthKitManager.h:
- (Void) writeWorkoutDataFromModelObject: (id) workoutModelObject;
Lägg till en ny deltyp till requestAuthorizationToShareTypes: readTypes: utförande:
metod genom att lägga till träningstypen till writeTypes
array.
NSArray * writeTypes = @ [[HKObjectType quantityTypeForIdentifier: HKQuantityTypeIdentifierBodyMass], [HKObjectType workoutType]];
Slutligen lägg till writeWorkoutDataFromModelObject:
metod längst ner på GSHealthKitManager
klass.
- (void) writeWorkoutDataFromModelObject: (id) workoutModelObject // I en verklig världsapp skulle du passera i ett modellobjekt som representerar dina träningsdata och du skulle dra aktuella data här och skicka den till HealthKit-träningsmetoden. // För enkelhetens skull i det här exemplet kommer vi bara att ange godtyckliga data. NSDate * startDate = [NSDate date]; NSDate * endDate = [startdatum datumByAddingTimeInterval: 60 * 60 * 2]; NSTimeInterval duration = [endDate timeIntervalSinceDate: startDate]; CGFloat DistanceInMeters = 57000 .; HKQuantity * distanceQuantity = [HKQuantity quantityWithUnit: [HKUnit meterUnit] doubleValue: (double) distanceInMeters]; HKWorkout * träning = [HKWorkout workoutWithActivityType: HKWorkoutActivityTypeRunning startDate: startDate endDate: endDate duration: duration totalEnergyBurned: nil totalDistance: distanceQuantity metadata: nil]; [self.healthStore saveObject: workout withCompletion: ^ (BOOL-framgång, NSError * -fel) NSLog (@ "Spara träning till healthStore - framgång:% @", framgång? @ "YES": @ "NEJ"); om (fel! = nil) NSLog (@ "fel:% @", fel); ];
I min egen app, Routie, har jag använt tillvägagångssättet att skicka ett modellobjekt till writeWorkoutDataFromModelObject:
metod som delegerar den tunga lyftningen till chefen klassen. Den senare drar de nödvändiga uppgifterna från modellobjektet och skickar informationen till HKHealthStore
exempel. Jag tror att det är ett bra tillvägagångssätt att hålla HealthKit-relaterad kod begränsad i cheferklassen.
Genomförandet av writeWorkoutDataFromModelObject:
Metoden är ganska enkel. Det finns bara tre steg:
HKWorkout
objekt genom att påkalla en av klassens bekvämlighetsinitierare.HKWorkout
protestera mot HKHealthStore
exempel.Det här är första gången vi har arbetat med HKWorkout-klassen så låt mig kort introducera den här klassen. HealthKit-ramverket använder HKWorkout
klass för att spåra aktiviteter. Övningar är oftast oföränderliga, så du måste ge träningens värden under initialiseringen.
När du initierar ett träningspass måste du ange en aktivitetstyp, ett startdatum och ett slutdatum. Du kan valfritt passera i totalt avstånd, totalt bränt energi och metadata. Metadata kan användas för att tilldela ytterligare information till träningen. Det här är verkligen användbart när du vill dela mer information om ett träningspass med en annan applikation som du också skapade.
writeWorkoutButtonPressed:
VerkanÖppna SecondViewController.m och lägg till följande import till toppen av filen:
#import "GSHealthKitManager.h"
Sedan implementerar du writeWorkoutButtonPressed:
metod som visas nedan.
- (IBAction) writeWorkoutButtonPressed: (id) avsändare // I en verklig världsapp, skulle du få referens till ett relevant modellobjekt och skicka det till följande metod. [[GSHealthKitManager sharedManager] requestAuthorization]; [[GSHealthKitManager sharedManager] writeWorkoutDataFromModelObject: noll];
Vi lägger bara till en enda knapp till andra appscenen för att skriva träningen. Öppna Main.storyboard och fokusera på den andra scenen. Ta bort etiketterna som för närvarande finns i andra bildskärmskontrollen.
Lägg till en knapp i mitten av visningskontrollens vy och ställ in titeln till Skriv träning. Anslut dess Touch Up Inside händelse till writeWorkoutButtonPressed:
åtgärd vi genomförde i föregående steg.
Bygg och kör programmet och sätt på Health integration-strömbrytaren. De Hälsotillgång skärmen kommer att presenteras med den nyligen efterfrågade träningstypen avstängd. Slå på och tryck på Gjort. Detta behövs bara, för vi lade till träningstypen till listan över deltyper. Det betyder att vi måste fråga användaren om tillstånd innan vi använder den.
Öppna den andra fliken längst ner och knacka på Skriv träning. Om allt gick rätt borde du se följande meddelande i Xcodes Console:
Spara träning till hälsaStore - framgång: JA
Nu kan du växla till Health app och gå till Hälso data > Kondition > träning. Där borde du se träningen som just tillsats.
I denna handledning har jag visat dig hur du kan skriva ett träningspass till HealthKit. Jag har också visat dig hur man separerar HealthKit-relaterad kod genom att skicka ett modellobjekt till den metod som skriver träningen till HealthKit.
Jag hoppas att du har haft den här handledningen och att du har lärt dig alla grunderna du behöver gå ut och integrera din egen app med HealthKit. Jag hoppas också att jag har övertygat dig om att ge HealthKit ett försök.
Låt mig veta i kommentarerna hur du tyckte om den här handledningen eller om något var oklart. Du kan också hitta mig på Twitter.
Listan nedan innehåller ett antal relevanta länkar så att du snabbt kan hoppa till vad du behöver: