Apple時計から直接心拍数にアクセスできますか?これは重複した質問ですが、5か月ほどで誰も質問していません。HealthAppからアクセスできることはわかっています。しかし、それがどれほど「リアルタイム」になるかはわかりません。
Apple Watchのセンサーに直接アクセスする方法はありません。HealthKitからのアクセスに依存する必要があります。
Apple伝道者はこれを言った
現在、ハートモニターアプリを作成することはできません。データがiPhoneにリアルタイムで送信されることは保証されていないため、何が起こっているのかをタイムリーに判断することはできません。
https://devforums.Apple.com/message/1098855#1098855 を参照してください
心拍数の生データ情報は、Watchkit for watchOS 2.0
で現在利用可能です。
WatchOS 2
には、HealthKit
などの他の既存のフレームワークに対する多くの拡張機能が含まれており、心拍数と健康情報にリアルタイムでアクセスする健康センサーにアクセスできます。
この情報は、合計30分のプレゼンテーションである次のセッションで確認できます。セッション全体を視聴したくない場合は、25〜28分の間にあるHealthkit API
機能に直接ジャンプします。
WWDC2015でのwatchOS2.0セッション用のWatchKit
これがソースコードの実装です link
HKWorkoutクラスリファレンス に記載されているように:
HKWorkout
クラスは、HKSample
クラスの具象サブクラスです。HealthKit
は、ワークアウトを使用してさまざまなアクティビティを追跡します。ワークアウトオブジェクトは、アクティビティに関する要約情報(たとえば、継続時間、合計距離、合計消費エネルギー)を格納するだけでなく、他のサンプルのコンテナとしても機能します。任意の数のサンプルをワークアウトに関連付けることができます。このようにして、ワークアウトに関連する詳細情報を追加できます。
その特定のリンクで、コードの次の部分はheartRateのサンプルレートを定義します
NSMutableArray *samples = [NSMutableArray array];
HKQuantity *heartRateForInterval =
[HKQuantity quantityWithUnit:[HKUnit unitFromString:@"count/min"]
doubleValue:95.0];
HKQuantitySample *heartRateForIntervalSample =
[HKQuantitySample quantitySampleWithType:heartRateType
quantity:heartRateForInterval
startDate:intervals[0]
endDate:intervals[1]];
[samples addObject:heartRateForIntervalSample];
彼らがそこに述べているように:
ワークアウトのタイプとアプリのニーズに基づいて、関連するサンプルの正確な長さを微調整する必要があります。 5分間隔を使用すると、ワークアウトを保存するために必要なメモリの量を最小限に抑えながら、長時間のワークアウトの過程での強度の変化の一般的な感覚を提供します。 5秒間隔を使用すると、ワークアウトのより詳細なビューが提供されますが、かなり多くのメモリと処理が必要になります。
HealthKitとWatchKitExtensionを調べた後、私の調査結果は次のとおりです。
HealthKitから心拍数データを取得するには、次のクエリを定期的に実行する必要があります。
func getSamples()
{
let heartrate =HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
let sort = [
NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
]
let heartRateUnit = HKUnit(fromString: "count/min")
let sampleQuery = HKSampleQuery(sampleType: heartrate!, predicate: nil, limit: 1, sortDescriptors: sort, resultsHandler: { [unowned self] (query, results, error) in
if let results = results as? [HKQuantitySample]
{
let sample = results[0] as HKQuantitySample
let value = sample.quantity.doubleValueForUnit(self.heartRateUnit)
print (value)
let rate = results[0]
print(results[0])
print(query)
self.updateHeartRate(results)
}
})
healthStore?.executeQuery(sampleQuery)
}
func updateHeartRate(samples: [HKSample]?)
{
guard let heartRateSamples = samples as? [HKQuantitySample] else {return}
dispatch_async(dispatch_get_main_queue()) {
guard let sample = heartRateSamples.first else{return}
let value = sample.quantity.doubleValueForUnit(self.heartRateUnit)
self.heartRateLabel.text = String(UInt16(value))
let date = sample.startDate
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
self.timeStampLabel.text = dateFormatter.stringFromDate(date)
}
}
誰かがより多くの情報を得るならば、私を更新してください。
ハッピーコーディング。
ワークアウトを開始して心拍数データを取得し、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 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;
}
});
}
さて、**[self updateHeartbeat:date]**
を書く時が来ました
-(void)updateHeartbeat:(NSDate *)startDate{
//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をオンにすることもできます。ご不明な点がございましたら、以下にコメントを残してください。