Watch OS 2.0 では、開発者は心拍センサーにアクセスできるようになっているはずです....ちょっと遊んで、自分のアイデアの簡単なプロトタイプを作成したいのですが、情報やドキュメントがどこにも見つかりません。この機能。
このタスクにアプローチする方法について誰か教えてもらえますか? リンクや情報をいただければ幸いです
Watch OS 2.0 では、開発者は心拍センサーにアクセスできるようになっているはずです....ちょっと遊んで、自分のアイデアの簡単なプロトタイプを作成したいのですが、情報やドキュメントがどこにも見つかりません。この機能。
このタスクにアプローチする方法について誰か教えてもらえますか? リンクや情報をいただければ幸いです
Apple は技術的には、watchOS 2.0 の心拍数センサーへのアクセスを開発者に許可していません。彼らが行っているのは、HealthKit のセンサーによって記録された心拍数データへの直接アクセスを提供することです。これを実行してほぼリアルタイムでデータを取得するには、主に 2 つのことを行う必要があります。まず、ワークアウトを開始していることをウォッチに伝える必要があります (たとえば、ランニングをしているとしましょう)。
// 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 からストリーミング クエリを開始して、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)
これについては、ビデオWhat's New in HealthKit - WWDC 2015 の最後にあるデモで詳しく説明されています。
ワークアウトを開始して心拍数データを取得し、ヘルスキットから心拍数データを照会できます。
ワークアウトデータの読み取り許可を求めます。
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 をオンにすることもできます。質問がある場合は、下にコメントを残してください。
HealthKit フレームワークの一部であるHKWorkoutを使用できます。
iOS 用のソフトウェア キットの多くは、HealthKit などの watchOS 用に利用できるようになりました。HealthKit (HK) の関数とクラスを使用して、消費カロリーを計算したり、心拍数を見つけたりできます。HKWorkout を使用して、ワークアウトに関するすべてを計算し、以前の iOS で行ったように心拍数などの関連変数にアクセスできます。HealthKit について学ぶには、Apple の開発者向けドキュメントをお読みください。それらは developer.apple.com にあります。