You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:14:52