如何在不使用锻炼课程的情况下在 watchOS 3+ 中获取心率

How to get heart rate in watchOS 3+ without using a workout session

我想通过 watchkit 扩展程序以编程方式收集用户的心率,但不是在锻炼期间。

据我所知,如果用户正在移动,watchOS 3+ 不会收集心率:但是一旦他休息了一段时间(10 分钟?)我想以某种方式获得当前的 bpm 值通过 HealthKit API。

由于您有配套的 iPhone 应用程序,您可以从那里查询心率更新。

  • 您只需要 iPhone 与配对的 Apple Watch(即 显而易见)
  • 默认的 Apple Watch 心率监测应用更新了 HealthKit 只有在前台时才会立即显示数据。
  • 当默认的 Apple Watch 心率监测应用程序位于 后台,每隔9-10更新一次HealthKit数据 分钟。 这段代码应该可以完成工作:

    import UIKit
    import HealthKit
    
    class ViewController: UIViewController {
    @IBOutlet weak var heartRateLabel: UILabel!
    @IBOutlet weak var timeStampLabel: UILabel!
    
    var hkStore: HKHealthStore?
    let heartRateUnit: HKUnit = HKUnit.count().unitDivided(by: .minute())
    var healthStore: HKHealthStore?
    override func viewDidLoad() {
        super.viewDidLoad()
        healthStore = HKHealthStore()
        let sampleTypes = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!
    
        healthStore?.requestAuthorization(toShare: [sampleTypes], read: [sampleTypes], completion: { (success, error) in
            if (error != nil) {
                print(error!.localizedDescription)
            }
        })
    
        getSamples()
    }
    func getSamples() {
        let heartrate = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)
        let sort = [
            NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
        ]
        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.doubleValue(for: self.heartRateUnit)
                let rate = results[0]
                print(value, rate)
                self.updateHeartRate(samples: results)
            }
        })
        healthStore?.execute(sampleQuery)
    }
    
    func updateHeartRate(samples: [HKSample]?) {
        guard let heartRateSamples = samples as? [HKQuantitySample] else {return}
        DispatchQueue.main.async {
            guard let sample = heartRateSamples.first else{return}
            let value = sample.quantity.doubleValue(for: self.heartRateUnit)
            self.heartRateLabel.text = String(UInt16(value))
            let date = sample.startDate
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss"
            self.timeStampLabel.text = dateFormatter.string(from: date)
         }
     }
    }
    

请注意查询需要定期触发。