web-dev-qa-db-ja.com

Appleウォッチの心拍数データ

Apple時計から直接心拍数にアクセスできますか?これは重複した質問ですが、5か月ほどで誰も質問していません。HealthAppからアクセスできることはわかっています。しかし、それがどれほど「リアルタイム」になるかはわかりません。

14
Andrew Garcia

Apple Watchのセンサーに直接アクセスする方法はありません。HealthKitからのアクセスに依存する必要があります。

Apple伝道者はこれを言った

現在、ハートモニターアプリを作成することはできません。データがiPhoneにリアルタイムで送信されることは保証されていないため、何が起こっているのかをタイムリーに判断することはできません。

https://devforums.Apple.com/message/1098855#1098855 を参照してください

10
Stephen Johnson

心拍数の生データ情報は、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秒間隔を使用すると、ワークアウトのより詳細なビューが提供されますが、かなり多くのメモリと処理が必要になります。

36
casillas

HealthKitとWatchKitExtensionを調べた後、私の調査結果は次のとおりです。

  1. 心拍数データを取得するためにWatchKit拡張機能は必要ありません。
  2. ペアリングされたiPhoneが必要ですApple時計(これは明らかです)
  3. デフォルトApple Watch Heart Rateモニターアプリは、フォアグラウンドにある場合にのみHealthKitデータを即座に更新します。
  4. デフォルトApple Watch Heart Rateモニターアプリがバックグラウンドにある場合、9〜10分間隔でHealthKitデータを更新します。
  5. 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)
        }
    }
    

誰かがより多くの情報を得るならば、私を更新してください。
ハッピーコーディング。

11
shoan

ワークアウトを開始して心拍数データを取得し、healthkitから心拍数データをクエリできます。

  1. ワークアウトデータを読み取るための許可を求める

    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);
    }
    }];
    
  2. iPhoneのAppDelegateで、このリクエストに応答します

    -(void)applicationShouldRequestHealthAuthorization:(UIApplication *)application{
    
    [healthStore handleAuthorizationForExtensionWithCompletion:^(BOOL success, NSError * _Nullable error) {
            if (success) {
                NSLog(@"phone recieved health kit request");
            }
        }];
    }
    
  3. 次に、実装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;
        }
        });
    }
    
  4. さて、**[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をオンにすることもできます。ご不明な点がございましたら、以下にコメントを残してください。

5
NeilNie