从healthKit提取心率

时间:2019-09-05 07:34:33

标签: ios swift xcode healthkit

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

1 个答案:

答案 0 :(得分: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)
}