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

HealthKit中KCAL数值未增加问题求助

问题分析与解决方案

问题描述

我正在将消耗的卡路里保存至HealthKit中央仓库,但遇到健身应用中KCAL总量未增加的问题。Workout保存功能正常,能查看时长与消耗的卡路里,但该数据未计入MOVE/KCAL总量,不过MOVE数值已正常增长。

问题代码

class func savingWorkout(duration : Double , burnedEnergy : Double , completion: @escaping (Result<Bool, Error>) -> ()) {
    
    let healthKitStore = HKHealthStore()
    let totalEnergyBurned = HKQuantity(unit: HKUnit.kilocalorie(), doubleValue: burnedEnergy)
    
    let finish = Date() // Now
    let start = finish.addingTimeInterval(-duration) // 1 hour ago
            
    
    let metadata = [
        HKMetadataKeyGroupFitness : false,
        HKMetadataKeyIndoorWorkout : true,
        HKMetadataKeyCoachedWorkout : true
    ]
    
    
    let workout = HKWorkout(
        activityType: .functionalStrengthTraining,
        start: start,
        end: finish,
        workoutEvents: nil,
        totalEnergyBurned: totalEnergyBurned,
        totalDistance: nil,
        device: nil,
        metadata: metadata
    )
    

    guard let energyBurnedType =
        HKObjectType.quantityType(forIdentifier:
            HKQuantityTypeIdentifier.activeEnergyBurned) else {
        fatalError("*** Unable to create an energy burned type ***")
    }

    let energyBurnedPerInterval = HKQuantity(unit: HKUnit.kilocalorie(),
                                             doubleValue: burnedEnergy)

    let energyBurnedPerIntervalSample =
        HKQuantitySample(type: energyBurnedType,
                         quantity: energyBurnedPerInterval,
                         start: start,
                         end: finish) as HKSample
    
    
    //3.  Save the same to HealthKit
     healthKitStore.save(energyBurnedPerIntervalSample) { (success, error) in
        
      if let error = error {
        print("Error Saving calories burned: \(error.localizedDescription)")
      } else {
        print("Calories saved")
      }
    }
    
        healthKitStore.save(workout) { result , error in
            if let error = error {
                completion(.failure(error))
                return
            }
           print("workout saved into HealthKit successfully ")
    }
    
}

解决方案

  • 核心问题:同时保存HKWorkout和独立的activeEnergyBurned样本,会导致HealthKit重复计算或判定其中一份数据无效。苹果健康应用会自动从Workout中提取能量消耗数据,无需单独保存重复样本。
  • 修复步骤:
    1. 移除单独保存energyBurnedPerIntervalSample的代码块,仅保留HKWorkout的保存逻辑。
    2. 确认HKWorkout的totalEnergyBurned参数设置正确,activityType与实际运动类型匹配(当前.functionalStrengthTraining符合力量训练场景,无需修改)。
    3. 校验权限:确保应用已申请HKQuantityTypeIdentifier.activeEnergyBurned和HKWorkoutType的写入权限。
  • 修正后的代码:
class func savingWorkout(duration : Double , burnedEnergy : Double , completion: @escaping (Result<Bool, Error>) -> ()) {
    
    let healthKitStore = HKHealthStore()
    let totalEnergyBurned = HKQuantity(unit: HKUnit.kilocalorie(), doubleValue: burnedEnergy)
    
    let finish = Date()
    let start = finish.addingTimeInterval(-duration)
            
    let metadata = [
        HKMetadataKeyGroupFitness : false,
        HKMetadataKeyIndoorWorkout : true,
        HKMetadataKeyCoachedWorkout : true
    ]
    
    let workout = HKWorkout(
        activityType: .functionalStrengthTraining,
        start: start,
        end: finish,
        workoutEvents: nil,
        totalEnergyBurned: totalEnergyBurned,
        totalDistance: nil,
        device: nil,
        metadata: metadata
    )
    
    healthKitStore.save(workout) { success, error in
        if let error = error {
            completion(.failure(error))
            return
        }
        print("workout saved into HealthKit successfully ")
        completion(.success(success))
    }
}
  • 额外说明:
    • 保存Workout时,HealthKit会自动将其中的能量消耗计入MOVE/KCAL总量,无需手动添加独立能量样本。
    • 若修复后仍不生效,可重启健康应用,或检查数据的时间范围是否合理(确保start和end为过去时间,而非未来时间)。

内容的提问来源于stack exchange,提问作者user9261559

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:03:02