Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Watch os 2.0 beta: access heart beat rate

Tags:

With Watch OS 2.0 developers are supposed to be allowed to access heart beat sensors.... I would love to play a bit with it and build a simple prototype for an idea I have, but I can't find anywhere info or documentation about this feature.

Can anyone point me on how to approach this task? Any link or info would be appreciated

like image 839
Sr.Richie Avatar asked Jun 11 '15 09:06

Sr.Richie


People also ask

Does Apple Watch 2 have heart rate monitor?

By flashing its LED lights hundreds of times per second, Apple Watch can calculate the number of times the heart beats each minute — your heart rate. The optical heart sensor supports a range of 30–210 beats per minute.

How accurate is Apple Watch 2 heart rate?

Overall, the chest strap was almost as good as the EKG, measuring 99% accuracy, which isn't too surprising as both technologies work the same way, capturing electrical activity directly from the heart.


2 Answers

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 session self.workoutSession = HKWorkoutSession(activityType: .Running, locationType: .Indoor) self.workoutSession!.delegate = self;  // Start the workout session self.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 start let 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 query self.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

like image 182
lehn0058 Avatar answered Dec 20 '22 13:12

lehn0058


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 HKQuantityTypeIdentifierHeartRate HKSampleType *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.

like image 38
NeilNie Avatar answered Dec 20 '22 12:12

NeilNie