如何在不使用锻炼课程的情况下在 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)
}
}
}
请注意查询需要定期触发。
我想通过 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) } } }
请注意查询需要定期触发。