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

如何通过HealthKit获取应用用户的平均跑步速度?

解决HealthKit获取跑步平均速度后解析数值的问题

你当前代码中averageQuantity()返回的是HKQuantity类型对象,直接用\(speedValue)输出的是对象描述信息,而非具体数值。要提取实际速度值,需要借助HKQuantity的doubleValue(for:)方法,传入对应的速度单位来完成转换。

修正后的代码示例

func fetchRunningStats(){
    let speedType = HKQuantityType(.runningSpeed)
    // 定义速度单位:米/秒(HealthKit中跑步速度的默认存储单位)
    let speedUnit = HKUnit.meter().unitDivided(by: HKUnit.second())
    // 如需公里/小时可替换为:HKUnit.meterUnit(with: .kilo).unitDivided(by: HKUnit.hour())
    let predicate = HKQuery.predicateForSamples(withStart: .startOfDay, end: Date())
    
    let query = HKStatisticsQuery(quantityType: speedType, quantitySamplePredicate: predicate) 
    { _, result, error in
        guard let statisticResult = result, error == nil else {
            print("获取跑步速度失败: \(error?.localizedDescription ?? "未知错误")")
            return
        }
        
        guard let averageSpeedQuantity = statisticResult.averageQuantity() else {
            print("今日无跑步速度数据")
            return
        }
        
        // 将HKQuantity转换为具体数值(米/秒)
        let averageSpeedValue = averageSpeedQuantity.doubleValue(for: speedUnit)
        // 转公里/小时可做换算:averageSpeedValue * 3.6
        
        let activity = Activity(
            title: "平均速度",
            subtitle: "跑步速度",
            image: "figure.run",
            amount: String(format: "%.2f m/s", averageSpeedValue),
            id: 0
        )
        
        DispatchQueue.main.async {
            self.activities["averagespeed"] = activity
        }
        print("平均跑步速度: \(averageSpeedValue) m/s")
    }
    healthStore.execute(query)
}

关键说明

  • 单位匹配:HealthKit存储跑步速度的基础单位为米/秒,可根据需求换算为公里/小时(乘以3.6)、英里/小时等其他单位。
  • 空值防护:必须判断averageQuantity()是否为nil,避免用户当日无跑步数据时触发崩溃。
  • 数值格式化:用String(format:)可以控制小数位数,让展示结果更直观友好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:36:12