gpt4 book ai didi

ios - hkworkout totalenergyburned 与 HKQuantityTypeIdentifierActiveEnergyBurned 不相关

转载 作者:可可西里 更新时间:2023-11-01 00:37:30 24 4
gpt4 key购买 nike

这与其说是编程语法问题,不如说是数据结构问题。 Health 应用程序的数据结构有点像黑盒子。

我想查询 HKHealthStore 并创建包括 ActiveEnergyBurned 在内的项目的每日摘要,以及包括 totalEnergyBurned 在内的锻炼摘要。

我有成功检索此信息的代码(如下)。然而,每天的总数通常比当天的锻炼少!我确信我的代码没有问题,因为 Apple Health 应用程序中显示的数字完全相同。例如:

昨天的训练:我的应用workout.totalEnergyBurned = 905 大卡昨天 ActiveEnergyBurned 的总和 655 kcal健康应用显示两者的数字完全相同。

如果 ActiveEnergyBurned 不包括锻炼,它包括什么?我没有另外 655 的 ActiveEnergyBurned。在我看来,ActiveEnergyBurned 不可能不包括锻炼!

   //to get sum of day's activeCaloriesBurned:

func getActiveCalories(startDate:NSDate, endDate:NSDate){
let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierActiveEnergyBurned)
let hkUnit = HKUnit.kilocalorieUnit()

getSumStatsFor(sampleType, hkUnit: hkUnit, startDate: startDate, endDate: endDate) { (hdObject, result) -> Void in
hdObject.activeCalories = result
}
}

func getTotalsForDataType(quantitiyType:HKQuantityType, startDate:NSDate, endDate:NSDate, completion:(HKStatisticsCollection!, NSError!) -> Void){
println("getTotalsForDataType start: \(startDate) end: \(endDate)")
let dayStart = NSCalendar.currentCalendar().startOfDayForDate(startDate)
let addDay = NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: 1, toDate: endDate, options:nil)
let dayEnd = NSCalendar.currentCalendar().startOfDayForDate(addDay!) //add one day
let interval = NSDateComponents()
interval.day = 1

let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: HKQueryOptions.None)
let newQuery = HKStatisticsCollectionQuery(quantityType: quantitiyType,
quantitySamplePredicate: predicate,
options: HKStatisticsOptions.CumulativeSum,
anchorDate: dayStart,
intervalComponents: interval)
newQuery.initialResultsHandler = {
query, results, error in
if error != nil {
println("*** An error occurred while calculating the statistics: \(error.localizedDescription) ***")
completion(nil, error)
}else{
completion(results,error)
}
}
self.healthKitStore.executeQuery(newQuery)
}

//to get workout totalCalories burned

func readWorkouts(completion: (([AnyObject]!, NSError!) ->Void)!){
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
let sampleQuery = HKSampleQuery(sampleType: HKWorkoutType.workoutType(), predicate: nil, limit: 0, sortDescriptors: [sortDescriptor]) { (sampleQuery, results, error) -> Void in
if let queryError = error {
println( "There was an error while reading the samples: \(queryError.localizedDescription)")
}
completion(results,error)
}
healthKitStore.executeQuery(sampleQuery)
}

最佳答案

这是由于 HealthKit 锻炼 API 的设计方式存在错误。使用当前 API,第 3 方应用程序可以创建 HKWorkout,其中 totalEnergyBurned 大于 0,但没有 的关联 HKSamples >HKQuantityTypeIdentifierActiveEnergyBurned 类型被创建以总结为 totalEnergyBurned。例如,将锻炼数据输入 HealthKit 的第 3 方应用程序可以这样做:

HKHealthStore *healthStore = [HKHealthStore new];
HKWorkout *workout = [HKWorkout workoutWithActivityType:HKWorkoutActivityTypePlay
startDate:[NSDate date]
endDate:[NSDate date]
duration:100.0
totalEnergyBurned:[HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit] doubleValue:445]
totalDistance:[HKQuantity quantityWithUnit:[HKUnit meterUnit] doubleValue:1000]
metadata:nil];
[healthStore saveObject:workout withCompletion:nil];

请注意,在任何地方都没有创建类型为 HKQuantityTypeIdentifierActiveEnergyBurned 的任何 HKSamples。然后,当您总结当天消耗的 active 能量并将其与锻炼消耗的总能量进行比较时,您将得到 0 kcal 与 445 kcal。一个好的第 3 方应用程序在创建锻炼后会做的是:

NSArray *workoutSamples = @[[HKQuantitySample quantitySampleWithType:HKQuantityTypeIdentifierActiveEnergyBurned
quantity:[HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit] doubleValue:workout.totalEnergyBurned]
startDate:workout.startDate
endDate:workout.endDate]];
[healthStore addSamples:workoutSamples toWorkout:workout completion:nil];

这样至少只有 active 能量燃烧样本。现在您将获得 445 kcal 与 445 kcal。

在我对第 3 方应用程序的测试中,我发现大多数应用程序确实添加了燃烧的 active 能量样本,但有些应用程序(如 Nike Running)没有添加。

解决这个问题的一个棘手的解决方法是提取锻炼的所有活跃能量样本(您必须使用 startDateendDate 因为 predicateForObjectsFromWorkout 有与上述类似的问题),然后如果没有任何样本,则假设源没有为该锻炼创建 active 能量样本并将锻炼的 totalEnergyBurned 添加到 active 一天的能量消耗总量。

关于ios - hkworkout totalenergyburned 与 HKQuantityTypeIdentifierActiveEnergyBurned 不相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31391065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com