iOS HealthKit-如何获得绝对最新的当前心率,例如手表心率并发症?

时间:2018-12-08 10:53:53

标签: swift4 health-kit watch-os watch-os-5 heartrate

我具有以下功能,可从HealthKit获取最近的心率。当我检查收到的样本时,它通常在最近5分钟内带有时间戳。但是,如果我看一下Apple Watch心率并发症,它有时具有不同的值,例如:

  • 我看到了:84 BPM 5分钟前
  • Apple Watch可以显示84 BPM 5 MIN AGO或现在大约80 BPM

我尝试使用结束日期进行实验,并使用“严格结束日期”,但仍然看到我从healthkit获得的数据经常落后于Apple Watch心率并发症。

我是否可以通过手表(跳过保健工具包)查询最新的心率?是否可以要求苹果手表立即进行心率测量?

static func getCurrentHeartRate () {
    guard let sampleType = HKObjectType.quantityType(forIdentifier: .heartRate) else {
        return}

    let predicate = HKQuery
        .predicateForSamples(
            withStart: Date().addingTimeInterval(-3600),
            end: Date(),
            options: [])

    let sortDescriptor = NSSortDescriptor(
        key: HKSampleSortIdentifierStartDate,
        ascending: false)
    let query = HKSampleQuery(sampleType: sampleType,
                              predicate: predicate,
                              limit: Int(1),
                              sortDescriptors: [sortDescriptor]) { query, results, error in

                                guard let samples = results as? [HKQuantitySample] else {

                                    return
                                }
                                for s in samples {
                                    print("Recent heart rate: \(s.heartRateString())")
                                }
    }
    HKHealthStore().execute(query)
}

extension HKQuantitySample {
    func heartRateString() -> String {
        let date = self.startDate
        let updateString = "\(heartRateStringShort())\(date.timeAgoString())"
        return updateString
    }

    func heartRateStringShort() -> String {

        let heartRateUnit = HKUnit(from: "count/min")
        let heartRate = Int(self.quantity.doubleValue(for: heartRateUnit))

        let updateString = "\(heartRate) BPM"
        return updateString
    }
}

1 个答案:

答案 0 :(得分:1)

如果您在手表上开始锻炼,则可以每隔几秒钟获取一次心率更新。查找如何设置HKLiveWorkoutBuilder

没有HKLiveWorkoutBuilder,更新速度不会很快。