观看操作系统2.0testing版:访问心脏跳动率
随着手表OS 2.0的开发人员应该被允许访问心跳传感器….我很想玩一点,并为我的想法build立一个简单的原型,但我无法find任何地方的信息或文件此function。
任何人都可以指出我如何处理这个任务? 任何链接或信息将不胜感激
苹果公司在技术上并没有给开发人员访问watchOS 2.0中的心率传感器。 他们正在做的是直接访问由HealthKit中的传感器logging的心率数据。 要做到这一点,并近乎实时地获取数据,有两件事情需要你做。 首先,你需要告诉手表,你正在开始锻炼(可以说你正在运行):
// 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!)
然后,您可以从HKHealthKit开始stream式查询,为HealthKit收到更新提供更新:
// 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)
在video结尾的演示中详细描述了这一点。HealthKit的新增function – WWDC 2015
您可以通过开始锻炼并从healthkit查询心率数据来获取心率数据。
请求阅读锻炼数据的准备。
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); } }];
在iPhone的AppDelegate中,回应这个请求
-(void)applicationShouldRequestHealthAuthorization:(UIApplication *)application{ [healthStore handleAuthorizationForExtensionWithCompletion:^(BOOL success, NSError * _Nullable error) { if (success) { NSLog(@"phone recieved health kit request"); } }]; }
然后实施Healthkit委托:
-(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; } }); }
现在是时候写[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]; }
您还可以打开Healthkit的function。 如果您有任何问题,请在下面留言。
您可以使用HealthKit框架的一部分HKWorkout。
iOS上的许多软件包现在都可以用于watchOS,比如HealthKit。 您可以使用HealthKit(HK)function和课程来计算消耗的卡路里,find心率等。您可以使用HKWorkout来计算所有关于锻炼的信息,并访问心率等相关variables,就像您之前使用iOS一样。 阅读Apple的开发者文档,了解HealthKit。 他们可以在developer.apple.comfind。