Вы на правильном пути.Ошибка, которую вы получаете, проста.Частота сердечных сокращений является дискретной опцией и не совместима с опцией статистики Cumulative Sum.
Из документации:
Нельзя объединить дискретный вариант с накопительным.
Нажмите здесь, чтобыузнать больше о HKStatisticsOptions
Решение:
Вам необходимо использовать .discreteMostRecent вместо .cumulativeSum
Обновленокод для внесения необходимых изменений:
@available(iOS 12.0, *)
func getTodaysHeartRate(completion: @escaping (Double) -> Void) {
let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)!
let now = Date()
let startOfDay = Calendar.current.startOfDay(for: now)
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
// replaced options parameter .cumulativeSum with .discreteMostRecent
let query = HKStatisticsQuery(quantityType: heartRateType, quantitySamplePredicate: predicate, options: .discreteMostRecent) { (_, result, error) in
var resultCount = 0
guard let result = result else {
print("Failed to fetch heart rate")
completion(Double(resultCount))
return
}
// More changes here in order to get bpm value
guard let beatsPerMinute: Double = result.mostRecentQuantity()?.doubleValue(for: HKUnit.count().unitDivided(by: HKUnit.minute())) else { return }
resultCount = Int(beatsPerMinute)
DispatchQueue.main.async {
completion(Double(resultCount))
}
}
healthStore.execute(query)
}
Примечание: опция .discreteMostRecent доступна только в iOS 12 или более поздней версии.