Highlight
WorkoutKit 从 watchOS 10 推出以来,一直只能构建跑步、骑行等陆上训练的自定义方案。watchOS 11 补上了最大的一块短板——泳池游泳。所有之前自定义训练里的 steps、goals、alerts API,现在原封不动地适用于游泳活动类型。
核心内容
如果你用过 WorkoutKit 构建自定义训练,一定踩过这个坑:跑步和骑行可以精细编排 steps、goals、alerts,但游泳完全不支持。用户在 App 里设计好一套间歇游泳方案,到了 Apple Watch 上只能手动操作——训练编排的连贯性断了。
watchOS 11 把自定义训练的全部能力扩展到了泳池游泳。steps、goals、alerts 这些 API 在游泳活动类型上完全可用,你之前为跑步写的训练编排逻辑可以直接复用。此外,WorkoutKit 专门为游泳新增了 poolSwimDistanceWithTime 目标类型——游泳者常做”游多少米、限多少时间”的间歇训练,这个目标类型把距离和时间绑在一起,两个条件都满足才会进入下一步。
除了游泳,过去一年还有一系列增量更新:watchOS 10.1 允许训练不指定室内/外位置;watchOS 10.4 给跑步和骑行新增了平均功率告警;watchOS 11 给室内跑步加了配速告警、给更多户外活动类型扩展了距离目标、给所有训练类型开放了自定义步骤名称。这些改动让 WorkoutKit 从”勉强覆盖陆上运动”变成了一个比较完整的训练编排框架。
详细内容
泳池游泳自定义训练
自定义游泳训练的结构与陆上训练完全一致:warmup → interval blocks → cooldown。区别在于目标类型新增了 poolSwimDistanceWithTime,它同时接收距离和时间参数。
以下代码来自 session 演示(05:05):
// 创建 distance with time 目标:50 米 + 1 分钟
let distanceGoal = WorkoutGoal(
poolSwimDistanceWithTime: .init(
distance: Measurement(value: 50, unit: UnitLength.meters),
time: Duration.seconds(60)
)
)
// 应用到 work step,并自定义步骤名称
let workStep = WorkoutStep(
goal: distanceGoal,
displayName: "Freestyle"
)
// 放入 interval block,重复 6 次
let intervalBlock = IntervalBlock(
workStep: workStep,
repeats: 6
)
// 热身和放松步骤
let warmupStep = WorkoutStep(
goal: .init(distance: Measurement(value: 200, unit: UnitLength.meters)),
displayName: "Kickboard"
)
let cooldownStep = WorkoutStep(
goal: .init(distance: Measurement(value: 200, unit: UnitLength.meters)),
displayName: "Free swim"
)
// 组装完整的泳池游泳训练
let swimmingWorkout = CustomWorkout(
activity: .swimming,
displayName: "Pool Swim Intervals",
blocks: [
.warmup(warmupStep),
.interval(intervalBlock),
.cooldown(cooldownStep)
]
)
// 使用 WorkoutScheduler 安排训练
try await WorkoutScheduler.shared.schedule(swimmingWorkout)
关键点:
poolSwimDistanceWithTime是游泳专属的目标类型,需要同时传入distance(Measurement<UnitLength>)和time(Duration)(05:05)- 两个目标都达成后才会前进到下一步。如果距离先完成,界面上会出现勾号,表示正在等待时间目标(07:30)
displayName属性是 watchOS 11 新增的,适用于所有训练类型的每个步骤(03:35)- 启动训练时 Apple Watch 会询问泳池长度。如果实际泳池长度与训练设计不一致,系统会自动按比例缩放距离和时间(06:54)
其他更新一览
用户可选位置(watchOS 10.1):安排训练时不再强制指定 indoor/outdoor,用户可以在开始训练时自行决定(01:25)。
平均功率告警(watchOS 10.4):跑步和骑行现在支持 averagePower 告警,区分当前功率和平均功率,支持范围告警和阈值告警两种模式(01:49)。
室内跑步配速告警(watchOS 11):之前只有户外跑步支持配速告警,现在室内跑步也支持了(02:06)。
距离目标扩展(watchOS 11):更多户外活动类型支持距离目标,包括新增的 outdoor rowing 和 outdoor skating。用 supportsGoal 函数检查某个活动+位置组合是否支持特定目标类型(02:47)。
自定义步骤名称(watchOS 11):WorkoutStep 新增 displayName 属性,适用于所有训练类型。未指定时默认显示步骤类型(如 “Work Step”)。名称会出现在步骤切换时的全屏提醒和训练中的详情视图中(03:13)。
核心启发
-
构建游泳间歇训练 App:
poolSwimDistanceWithTime直接对应游泳者”限时间游距离”的训练模式。为什么值得做:主流训练 App 对泳池游泳的支持都很弱,而 Apple Watch 的游泳追踪在硬件层面已经很成熟(圈数检测、水下心率),加上自定义训练编排,体验可以超越 Garmin 等专业设备。怎么开始:从最简单的间歇模板做起——热身 + N 组”X 米 / Y 秒” + 放松,用WorkoutScheduler同步到手表。 -
给现有训练步骤加上 displayName:watchOS 11 的
displayName适用于所有训练类型。为什么值得做:用户在训练中看到”Work Step 3”毫无信息量,改为”Bench Press 60kg”或”Sprint 400m”能减少认知负担,降低操作失误。怎么开始:遍历你的WorkoutStep创建逻辑,为每个 step 补上displayName,内容可以包含动作名称、重量、配速等上下文。 -
利用 supportsGoal 做运行时兼容性检查:距离目标的支持范围在 watchOS 11 扩大了,但不同活动类型和位置组合的支持情况不同。为什么值得做:硬编码”这个活动支持距离目标”会在新系统上漏掉支持,在旧系统上崩溃。怎么开始:在创建 goal 之前调用
supportsGoal函数,根据返回值决定是否展示该目标选项,或降级到时间/能量目标。
关联 Session
- Build custom workouts with WorkoutKit — 去年的 session,详细讲解了自定义训练的 steps、goals、alerts 结构
- Get started with HealthKit in visionOS — 在 visionOS 上使用 HealthKit 构建健康数据体验
- Explore wellbeing APIs in HealthKit — HealthKit 新增的心理健康和情绪状态 API
- What’s new in watchOS 11 — watchOS 11 全平台更新,包括 double tap 和 Smart Stack 改进
评论
GitHub Issues · utterances