从 healthKit 中提取心率

Posted

技术标签:

【中文标题】从 healthKit 中提取心率【英文标题】:Extract heart rate from healthKit 【发布时间】:2019-09-05 07:34:33 【问题描述】:

我正在尝试使用 swift 构建一个应用程序,该应用程序将从 iwatch 中提取心率并将其显示给用户,同时它会在用户的 iphone 中播放一些音乐。对 ios 来说很新,所以我试图弄清楚如何从 iwatch 中的 healthkit 中提取数据并将其与移动应用程序同步。我需要构建 2 个应用程序,一个用于手表和手机还是同一个应用程序?以及如何集成健康工具包,因为我刚刚在 target->capabilities 中启用了它。

【问题讨论】:

可能重复:***.com/questions/35039742/… 【参考方案1】:
public func subscribeToHeartBeatChanges() 

  // Creating the sample for the heart rate
  guard let sampleType: HKSampleType =
    HKObjectType.quantityType(forIdentifier: .heartRate) else 
      return
  

  /// Creating an observer, so updates are received whenever HealthKit’s
  // heart rate data changes.
  self.heartRateQuery = HKObserverQuery.init(
    sampleType: sampleType,
    predicate: nil)  [weak self] _, _, error in
      guard error == nil else 
        log.warn(error!)
        return
      

      /// When the completion is called, an other query is executed
      /// to fetch the latest heart rate
      self.fetchLatestHeartRateSample(completion:  sample in
        guard let sample = sample else 
          return
        

        /// The completion in called on a background thread, but we
        /// need to update the UI on the main.
        DispatchQueue.main.async 

          /// Converting the heart rate to bpm
          let heartRateUnit = HKUnit(from: "count/min")
          let heartRate = sample
            .quantity
            .doubleValue(for: heartRateUnit)

          /// Updating the UI with the retrieved value
          self?.heartRateLabel.setText("\(Int(heartRate))")
        
      )
  


public func fetchLatestHeartRateSample(
  completion: @escaping (_ sample: HKQuantitySample?) -> Void) 

  /// Create sample type for the heart rate
  guard let sampleType = HKObjectType
    .quantityType(forIdentifier: .heartRate) else 
      completion(nil)
    return
  

  /// Predicate for specifiying start and end dates for the query
  let predicate = HKQuery
    .predicateForSamples(
      withStart: Date.distantPast,
      end: Date(),
      options: .strictEndDate)

  /// Set sorting by date.
  let sortDescriptor = NSSortDescriptor(
    key: HKSampleSortIdentifierStartDate,
    ascending: false)

  /// Create the query
  let query = HKSampleQuery(
    sampleType: sampleType,
    predicate: predicate,
    limit: Int(HKObjectQueryNoLimit),
    sortDescriptors: [sortDescriptor])  (_, results, error) in

      guard error == nil else 
        print("Error: \(error!.localizedDescription)")
        return
      

      completion(results?[0] as? HKQuantitySample)
  

  self.healthStore.execute(query)

【讨论】:

不只是复制和粘贴代码,您应该详细说明为什么您认为您的代码可以工作。 我认为代码中已经有适当的 cmets。这段代码对我有用 这段代码放在哪里?内部接口控制器? 因为在我的情况下,它说 self.heartRateQuery 它说未定义对 interfacecontroller 的引用 ... 'InterfaceController' 类型的值没有成员 'heartRateQuery';您的意思是“heartRateLabel”吗?

以上是关于从 healthKit 中提取心率的主要内容,如果未能解决你的问题,请参考以下文章

HealthKit 提高心率通知变量?

从 HealthKit 检索心率数据时遇到问题

Swift HealthKit 触发心率样本

如何使用 Swift 查询 Healthkit 的平均心率

如何使用 Swift 查询 Healthkit 的平均心率

尝试从 HealthKit Store 转换心率时出现异常