WWDC Quick Look 💓 By SwiftGGTeam
Build custom swimming workouts with WorkoutKit

Build custom swimming workouts with WorkoutKit

观看原视频

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 是游泳专属的目标类型,需要同时传入 distanceMeasurement<UnitLength>)和 timeDuration)(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)。


核心启发

  1. 构建游泳间歇训练 ApppoolSwimDistanceWithTime 直接对应游泳者”限时间游距离”的训练模式。为什么值得做:主流训练 App 对泳池游泳的支持都很弱,而 Apple Watch 的游泳追踪在硬件层面已经很成熟(圈数检测、水下心率),加上自定义训练编排,体验可以超越 Garmin 等专业设备。怎么开始:从最简单的间歇模板做起——热身 + N 组”X 米 / Y 秒” + 放松,用 WorkoutScheduler 同步到手表。

  2. 给现有训练步骤加上 displayName:watchOS 11 的 displayName 适用于所有训练类型。为什么值得做:用户在训练中看到”Work Step 3”毫无信息量,改为”Bench Press 60kg”或”Sprint 400m”能减少认知负担,降低操作失误。怎么开始:遍历你的 WorkoutStep 创建逻辑,为每个 step 补上 displayName,内容可以包含动作名称、重量、配速等上下文。

  3. 利用 supportsGoal 做运行时兼容性检查:距离目标的支持范围在 watchOS 11 扩大了,但不同活动类型和位置组合的支持情况不同。为什么值得做:硬编码”这个活动支持距离目标”会在新系统上漏掉支持,在旧系统上崩溃。怎么开始:在创建 goal 之前调用 supportsGoal 函数,根据返回值决定是否展示该目标选项,或降级到时间/能量目标。


关联 Session

评论

GitHub Issues · utterances