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

如何获取HKWorkoutActivityType的用户友好字符串及HKWorkout样本描述?

把HKWorkoutActivityType转成用户友好字符串的最佳方案

嘿,刚好做过类似的功能!其实HealthKit已经帮我们搞定了大部分工作,不用自己手动维护活动类型和字符串的映射表,下面是具体的实现思路和注意点:

1. 用官方内置的本地化方法(首选)

HealthKit提供了HKWorkoutActivityType.name(for:)这个方法,它会直接返回对应活动类型的本地化友好名称,适配系统当前的语言(比如英文是"Running",中文就是"跑步"),而且覆盖了所有官方支持的活动类型,比自己硬编码靠谱太多。

Swift代码示例:

import HealthKit

func getWorkoutTypeName(for type: HKWorkoutActivityType) -> String {
    return HKWorkoutActivityType.name(for: type) ?? "未知运动"
}

2. 不要忽略自定义活动类型

如果用户创建了自定义的锻炼(对应HKWorkoutActivityType.custom),上面的方法会返回默认的"自定义运动",这时候你需要读取HKWorkout的workoutName属性——这是用户自己设置的自定义名称,要优先显示这个:

func getDisplayName(for workout: HKWorkout) -> String {
    // 自定义类型优先取用户设置的名称
    if workout.activityType == .custom, let customName = workout.workoutName {
        return customName
    }
    // 其他类型用官方本地化名称
    return HKWorkoutActivityType.name(for: workout.activityType) ?? "未知运动"
}

3. 有没有遗漏的内容?

  • 细分活动类型:比如indoorRunning和outdoorRunning,name(for:)会分别返回"室内跑步"和"户外跑步",已经足够清晰,不需要额外处理。
  • 罕见活动类型:如果遇到比较冷门的活动类型(比如rowingMachine),官方方法也能返回正确的本地化名称,不用自己操心。

4. 获取HKWorkout描述的更佳方法

除了活动类型名称,你还可以结合HKWorkout的其他属性,生成更丰富的用户描述,比如:

  • 时长:把duration转换成分钟/小时格式(比如"35分钟")
  • 卡路里消耗:通过workout.statistics(for:)读取activeEnergyBurned的统计值
  • 距离:针对跑步、骑行等运动,读取distanceWalkingRunning或对应类型的统计值
  • 时间:startDate和endDate转换成易读的日期格式(比如"2024年5月20日 晚7点")

示例代码(组合这些信息):

func getFullWorkoutDescription(for workout: HKWorkout) -> String {
    var parts = [String]()
    
    // 活动名称
    parts.append(getDisplayName(for: workout))
    
    // 时长
    let durationMinutes = Int(workout.duration / 60)
    parts.append("\(durationMinutes)分钟")
    
    // 卡路里消耗(需要确保有权限访问对应数据)
    if let energyType = HKObjectType.quantityType(forIdentifier: .activeEnergyBurned),
       let energyStats = workout.statistics(for: energyType),
       let energySum = energyStats.sumQuantity() {
        let calories = energySum.doubleValue(for: HKUnit.kilocalorie())
        parts.append(String(format: "消耗%.0f千卡", calories))
    }
    
    return parts.joined(separator: " · ")
}

最终展示效果类似:户外跑步 · 35分钟 · 消耗320千卡,用户体验会好很多。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:44:10