1

试图让 HeartbeatSeries 工作,但不确定如何获得 HkHeartbeatSeriesSample。这是我的代码

我有这个查询,它将从 HeartbeatSeries 返回数据,但我不确定如何获取 HKHeartbeatSeriesSample

从这里构建查询

https://developer.apple.com/documentation/healthkit/hkheartbeatseriesquery/3113764-initwithheartbeatseries?language=objc

-(void)fetchHeartSeries:(HKHeartbeatSeriesSample *)sample
                      timeSinceStart: (NSTimeInterval *)timeSinceStart
             completion:(void (^)(NSArray *, NSError *))completionHandler API_AVAILABLE(ios(13.0)){
  HKHeartbeatSeriesSample *sampleSeries = sample;
  NSTimeInterval *timeSince = timeSinceStart;

  if (@available(iOS 13.0, *)) {
    HKHeartbeatSeriesQuery *query =  [
                                      [HKHeartbeatSeriesQuery alloc]
                                      initWithHeartbeatSeries:(HKHeartbeatSeriesSample *)sampleSeries
                                      dataHandler:^(HKHeartbeatSeriesQuery *query,
                                                    NSTimeInterval timeSince,
                                                    BOOL precededByGap,
                                                    BOOL done,
                                                    NSError * error){
      if (error) {
        // Perform proper error handling here
        NSLog(@"*** An error occurred while getting the heart beat series: %@ ***", error.localizedDescription);
        completionHandler(nil, error);
      }

      if(done){
        NSArray *data = query.accessibilityElements;
        NSLog(@"Successfully retrieved heart beat data");
        completionHandler(data, nil);
      }
    }];
    [self.healthStore executeQuery:query];
  } else {
    // Fallback on earlier versions
  }

}
4

1 回答 1

0

我就是这样做的。请注意,您需要HKSeriesType.heartbeat()在函数中添加为读取类型之一,requestAuthorization才能获得获取 Beat-to-Beat 测量的权限。

一个简单的概念验证,从过去 2 小时中获取 HKHeartbeatSeriesSamples,并使用第一个获取逐搏测量值并从一开始就打印出时间戳差异。

我很抱歉在这里使用 Swift。让我知道,我可以提供一个 Objective-C 版本。

let last2hours = HKQuery.predicateForSamples(withStart: Date().addingTimeInterval(-60 * 60 * 24), end: Date(), options: [])
let hbSeriesSampleType = HKSeriesType.heartbeat()
let heartbeatSeriesSampleQuery = HKSampleQuery(sampleType: hbSeriesSampleType, predicate: last2hours, limit: 20, sortDescriptors: nil) { (sampleQuery, samples, error) in
    if let heartbeatSeriesSample = samples?.first as? HKHeartbeatSeriesSample {
        let query = HKHeartbeatSeriesQuery(heartbeatSeries: heartbeatSeriesSample) { (query, timeSinceSeriesStart, precededByGap, done, error) in
            print(timeSinceSeriesStart)
        }
        self.healthStore.execute(query)
    }
}
healthStore.execute(heartbeatSeriesSampleQuery)

对于这个 HKHeartbeatSeriesSample:

count=23 F7D641F8-07AD-4543-84C8-126EA7B98B0F "Eric’s Apple Watch" (7.3.3), "Watch6,2" (7.3.3) "Apple Watch"  (2021-04-13 17:18:59 -0500 - 2021-04-13 17:19:59 -0500)

上面的代码打印到控制台:

0.78125
1.5390625
2.296875
3.08203125
3.87109375
4.61328125
5.37109375
6.10546875
6.86328125
7.7109375
9.3359375
10.94921875
11.76953125
12.5625
20.05078125
20.84765625
21.625
22.45703125
32.62109375
33.36328125
34.08203125
34.8046875
35.53515625
于 2021-04-14T21:19:56.337 回答