Watch os 2.0 beta: access heart beat rate Watch os 2.0 beta: access heart beat rate ios ios

Watch os 2.0 beta: access heart beat rate


Apple isn't technically giving developers access to the heart rate sensors in watchOS 2.0. What they are doing is providing direct access to heart rate data recorded by the sensor in HealthKit. To do this and get data in near-real time, there are two main things you need to do. First, you need to tell the watch that you are starting a workout (lets say you are running):

// Create a new workout sessionself.workoutSession = HKWorkoutSession(activityType: .Running, locationType: .Indoor)self.workoutSession!.delegate = self;// Start the workout sessionself.healthStore.startWorkoutSession(self.workoutSession!)

Then, you can start a streaming query from HKHealthKit to give you updates as HealthKit receives them:

// This is the type you want updates on. It can be any health kit type, including heart rate.let distanceType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)// Match samples with a start date after the workout startlet predicate = HKQuery.predicateForSamplesWithStartDate(workoutStartDate, endDate: nil, options: .None)let distanceQuery = HKAnchoredObjectQuery(type: distanceType!, predicate: predicate, anchor: 0, limit: 0) { (query, samples, deletedObjects, anchor, error) -> Void in    // Handle when the query first returns results    // TODO: do whatever you want with samples (note you are not on the main thread)}// This is called each time a new value is entered into HealthKit (samples may be batched together for efficiency)distanceQuery.updateHandler = { (query, samples, deletedObjects, anchor, error) -> Void in    // Handle update notifications after the query has initially run    // TODO: do whatever you want with samples (note you are not on the main thread)}// Start the queryself.healthStore.executeQuery(distanceQuery)

This is all described in full detail in the demo at the end of the video What's New in HealthKit - WWDC 2015


You can get heart rate data by starting a workout and query heart rate data from healthkit.

Ask for premission for reading workout data.

HKHealthStore *healthStore = [[HKHealthStore alloc] init];HKQuantityType *type = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];HKQuantityType *type2 = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierDistanceWalkingRunning];HKQuantityType *type3 = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned];[healthStore requestAuthorizationToShareTypes:nil readTypes:[NSSet setWithObjects:type, type2, type3, nil] completion:^(BOOL success, NSError * _Nullable error) {    if (success) {        NSLog(@"health data request success");    }else{        NSLog(@"error %@", error);    }}];

In AppDelegate on iPhone, respond this this request

-(void)applicationShouldRequestHealthAuthorization:(UIApplication *)application{[healthStore handleAuthorizationForExtensionWithCompletion:^(BOOL success, NSError * _Nullable error) {    if (success) {        NSLog(@"phone recieved health kit request");    }}];}

Then implement Healthkit Delegate:

-(void)workoutSession:(HKWorkoutSession *)workoutSession didFailWithError:(NSError *)error{NSLog(@"session error %@", error);}-(void)workoutSession:(HKWorkoutSession *)workoutSession didChangeToState:(HKWorkoutSessionState)toState fromState:(HKWorkoutSessionState)fromState date:(NSDate *)date{dispatch_async(dispatch_get_main_queue(), ^{switch (toState) {    case HKWorkoutSessionStateRunning:        //When workout state is running, we will excute updateHeartbeat        [self updateHeartbeat:date];        NSLog(@"started workout");    break;    default:    break;}});}

Now it's time to write [self updateHeartbeat:date]

-(void)updateHeartbeat:(NSDate *)startDate{__weak typeof(self) weakSelf = self;//first, create a predicate and set the endDate and option to nil/none NSPredicate *Predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:nil options:HKQueryOptionNone];//Then we create a sample type which is HKQuantityTypeIdentifierHeartRateHKSampleType *object = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];//ok, now, create a HKAnchoredObjectQuery with all the mess that we just created.heartQuery = [[HKAnchoredObjectQuery alloc] initWithType:object predicate:Predicate anchor:0 limit:0 resultsHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *sampleObjects, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *newAnchor, NSError *error) {if (!error && sampleObjects.count > 0) {    HKQuantitySample *sample = (HKQuantitySample *)[sampleObjects objectAtIndex:0];    HKQuantity *quantity = sample.quantity;    NSLog(@"%f", [quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]]);}else{    NSLog(@"query %@", error);}}];//wait, it's not over yet, this is the update handler[heartQuery setUpdateHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *SampleArray, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *Anchor, NSError *error) { if (!error && SampleArray.count > 0) {    HKQuantitySample *sample = (HKQuantitySample *)[SampleArray objectAtIndex:0];    HKQuantity *quantity = sample.quantity;    NSLog(@"%f", [quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]]); }else{    NSLog(@"query %@", error); }}];//now excute query and wait for the result showing up in the log. Yeah![healthStore executeQuery:heartQuery];}

You also have a turn on Healthkit in capbilities. Leave a comment below if you have any questions.


You may use HKWorkout, which is part of the HealthKit framework.