HKStatisticsQuery无返回值排查:iOS健康数据查询异常
iOS时段健康数据查询无返回值问题
我正在开发一款iOS应用,用于获取某一时段内的累计及平均健康数据(步数、心率、腕部体温、血氧、呼吸率)。时段由计时器的开始与结束时间确定:计时器停止后,累计数据会保存至视图;计时器运行时,需在UI展示最新健康数据。
我尝试将这些时间点作为谓词参数传入HKStatisticsQuery,但测试时始终无数据返回,仅得到0值。已排除健康权限问题(可成功执行实时心率查询),怀疑是查询配置存在问题。相关代码如下:
func updateHealthData(isFinalFetch: Bool = false) { let endDate = Date() guard let startDate = startTime else { return } let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictEndDate) let dispatchGroup = DispatchGroup() dispatchGroup.enter() fetchStepsData(predicate: predicate) { dispatchGroup.leave() } dispatchGroup.enter() fetchHeartRateData(predicate: predicate) { dispatchGroup.leave() } dispatchGroup.enter() fetchWristTemperatureData(predicate: predicate) { dispatchGroup.leave() } dispatchGroup.enter() fetchBloodOxygenData(predicate: predicate) { dispatchGroup.leave() } dispatchGroup.enter() fetchRespiratoryRateData(predicate: predicate) { dispatchGroup.leave() } dispatchGroup.notify(queue: .main) { if isFinalFetch { // Store final session data if this is the last fetch activityController.addRecordedSession( activityTitle: activity.title, totalTime: elapsedTime, accelerometerData: accelerometerData, gyroscopeData: gyroscopeData, gravityData: gravityData, orientationData: orientationData, heartRate: heartRateAverage, stepCount: stepCountTotal, wristTemperature: wristTemperatureAverage, bloodOxygenLevel: bloodOxygenAverage, respiratoryRate: respiratoryRateAverage ) } } } // Fetching Functions func fetchStepsData(predicate: NSPredicate, completion: @escaping () -> Void) { let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)! let query = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in if let sum = result?.sumQuantity() { DispatchQueue.main.async { self.stepCountTotal = sum.doubleValue(for: HKUnit.count()) } } completion() } healthKitManager.healthStore.execute(query) } func fetchHeartRateData(predicate: NSPredicate, completion: @escaping () -> Void) { let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)! let query = HKStatisticsQuery(quantityType: heartRateType, quantitySamplePredicate: predicate, options: .discreteAverage) { _, result, _ in if let avg = result?.averageQuantity() { DispatchQueue.main.async { self.heartRateAverage = avg.doubleValue(for: HKUnit(from: "count/min")) } } completion() } healthKitManager.healthStore.execute(query) } func fetchWristTemperatureData(predicate: NSPredicate, completion: @escaping () -> Void) { let wristTempType = HKQuantityType.quantityType(forIdentifier: .bodyTemperature)! let query = HKStatisticsQuery(quantityType: wristTempType, quantitySamplePredicate: predicate, options: .discreteAverage) { _, result, _ in if let avg = result?.averageQuantity() { DispatchQueue.main.async { self.wristTemperatureAverage = avg.doubleValue(for: HKUnit.degreeCelsius()) } } completion() } healthKitManager.healthStore.execute(query) } func fetchBloodOxygenData(predicate: NSPredicate, completion: @escaping () -> Void) { let oxygenType = HKQuantityType.quantityType(forIdentifier: .oxygenSaturation)! let query = HKStatisticsQuery(quantityType: oxygenType, quantitySamplePredicate: predicate, options: .discreteAverage) { _, result, _ in if let avg = result?.averageQuantity() { DispatchQueue.main.async { self.bloodOxygenAverage = avg.doubleValue(for: HKUnit.percent()) * 100 } } completion() } healthKitManager.healthStore.execute(query) } func fetchRespiratoryRateData(predicate: NSPredicate, completion: @escaping () -> Void) { let respiratoryRateType = HKQuantityType.quantityType(forIdentifier: .respiratoryRate)! let query = HKStatisticsQuery(quantityType: respiratoryRateType, quantitySamplePredicate: predicate, options: .discreteAverage) { _, result, _ in if let avg = result?.averageQuantity() { DispatchQueue.main.async { self.respiratoryRateAverage = avg.doubleValue(for: HKUnit.count().unitDivided(by: HKUnit.minute())) } } completion() } healthKitManager.healthStore.execute(query) }
截图说明
- 计时器运行时变量未更新
- 保存的最终值无数据展示
内容的提问来源于stack exchange,提问作者Kayla Anderson
相关产品推荐
相关产品推荐

