WWDC Quick Look 💓 By SwiftGGTeam
Build custom workouts with WorkoutKit

Build custom workouts with WorkoutKit

元の動画を見る

ハイライト

WorkoutKit は新しい Swift フレームワークで、開発者が iOS と watchOS アプリでカスタムトレーニングプランを作成、プレビュー、スケジュールし、Apple Watch のワークアウト app に同期できます。4 つのトレーニングタイプ(単一目標、ペーサー、トライアスロン、カスタムインターバル)をサポートし、それぞれ定義済みモデルとシステムレベルの UI を提供します。


主要内容

フィットネス app 開発者は長年、ユーザーが Apple Watch でカスタムトレーニングプランを使いたいのに、実装が複雑で直感的でないという課題に直面してきました。

以前この機能を実現するには、watchOS 上でタイミング、アラート、目標追跡、UI 表示を含むトレーニングロジック全体を再構築する必要がありました。作業量は膨大で、ユーザー体験もシステムのワークアウト app と一致しません。ユーザーはワークアウト app の操作に慣れており、サードパーティ実装は同じ滑らかさを達成するのが困難です。

Apple は iOS 17 と watchOS 10 で WorkoutKit フレームワークを導入しました。このフレームワークは定義済みのトレーニングモデルを提供し、開発者はトレーニング内容を記述するだけで、システムが UI と同期を自動処理します。

WorkoutKit は 4 つのトレーニングタイプをサポートします。

単一目標トレーニング(SingleGoalWorkout):最もシンプルな形式で、ユーザーが 1 つの目標を達成します。5 キロ走、500 カロリー消費、30 分継続など。

ペーサートレーニング(PacerWorkout):規定時間内に規定距離を完走します。マラソンペースでトレーニングするユーザーが 50 分で 10 キロを走る場合、システムは目標ペース範囲内にいるかをリアルタイム表示します。

トライアスロントレーニング(SwimBikeRunWorkout):水泳、サイクリング、ランニングのシームレスな切り替えをサポートします。種目切り替え時に手動で停止・再開する必要がありません。

カスタムインターバルトレーニング(CustomWorkout):最も柔軟なタイプです。開発者はウォームアップ、クールダウン、複数の繰り返しトレーニングブロックを定義でき、各ブロックには作業と回復フェーズがあり、カスタム目標とアラートを設定できます。

トレーニングを構築したら WorkoutPlan でラップし、システムのワークアウト app を開く、データをエクスポートする、または WorkoutScheduler で Apple Watch への定時同期を行えます。

定時同期機能は別の課題も解決します。ユーザーは毎回 app を開かずに 1 週間分のトレーニングを事前計画したいと考えています。トレーニングプランは Apple Watch のワークアウト app に独立して表示され、app のアイコンと名前が付きます。


詳細

単一目標トレーニング(02:15

SingleGoalWorkout は最もシンプルなトレーニングタイプで、「1 つの目標を達成する」シナリオに適しています。

import WorkoutKit

// 5 キロのランニングトレーニングを作成
let workout = SingleGoalWorkout(
    activity: .running,
    location: .outdoor,
    goal: .distance(.kilometers(5))
)

// トレーニングプランとしてラップ
let plan = WorkoutPlan(workout, id: "5k-run")

キーポイント:

  • activity で運動タイプ(running、cycling、swimming など)を指定
  • location で環境(outdoor、indoor)を指定
  • goal.distance.time.energy のいずれか
  • WorkoutPlan はトレーニングを開く・エクスポートする統一インターフェースを提供

ペーサートレーニング(05:30

PacerWorkout は距離と時間の両方の目標を設定し、ペーストレーニングに適しています。

// ペーサートレーニングを作成:50 分以内に 10 キロを走る
let workout = PacerWorkout(
    activity: .running,
    location: .outdoor,
    distance: .kilometers(10),
    time: .minutes(50)
)

let plan = WorkoutPlan(workout, id: "10k-pacer")

キーポイント:

  • ペーサートレーニングは距離と時間の両方の進捗を表示
  • システムがユーザーが目標ペース範囲内にいるかを自動判定
  • マラソントレーニングやテンポランに適している

カスタムインターバルトレーニング(08:45

CustomWorkout は構造化トレーニングをサポートし、HIIT、Tabata などのシナリオに適しています。

// ワークフェーズを作成:1 キロ走り、速度は 8-10 mph
let workStep = WorkoutStep(
    goal: .distance(.kilometers(1)),
    alert: .speed(.milesPerHour(8...10), metric: .speed)
)

// リカバリーフェーズを作成:心拍数を 140 以下に下げる
let recoveryStep = WorkoutStep(
    goal: .time(.minutes(3)),
    alert: .heartRate(120...140)
)

// トレーニングブロックを作成:4 回繰り返す
let block = IntervalBlock(
    steps: [workStep, recoveryStep],
    iterations: 4
)

// 完全なトレーニングを組み立て:ウォームアップ + トレーニングブロック + クールダウン
let workout = CustomWorkout(
    activity: .running,
    location: .outdoor,
    displayName: "HIIT ランニング",
    warmup: WorkoutStep(goal: .time(.minutes(5))),
    blocks: [block],
    cooldown: WorkoutStep(goal: .time(.minutes(5)))
)

let plan = WorkoutPlan(workout, id: "hiit-run")

キーポイント:

  • WorkoutStepgoalalert を含む単一フェーズを定義
  • WorkoutGoal は distance、time、energy、open の 4 タイプをサポート
  • WorkoutAlert は速度、心拍数、パワー、ケイデンスのリアルタイムフィードバックを提供
  • IntervalBlockiterations で繰り返し回数を制御
  • warmupcooldown はオプション

トレーニングアラートタイプ(12:20

WorkoutAlert は複数のアラート方法を提供します。

// 速度アラート(範囲モード)
.speed(.milesPerHour(8...10), metric: .speed)

// 速度アラート(しきい値モード)
.speed(.above(.milesPerHour(8)), metric: .speed)

// 心拍数範囲アラート
.heartRate(120...140)

// 心拍数範囲アラート(定義済みゾーンを使用)
.heartRate(zone: .zone3)

// パワーアラート
.power(.watts(200...250))

// ケイデンスアラート
.cadence(.stepsPerMinute(85...95))

キーポイント:

  • 各アラートはレンジモードとしきい値モードをサポート
  • metric パラメータで表示するメトリックタイプを指定
  • 運動タイプごとに異なるアラートをサポート(サイクリングはパワー対応、水泳はケイデンス非対応)
  • ユーザーが目標から外れたとき、システムが触覚と音声フィードバックを提供

トライアスロントレーニング(15:50

SwimBikeRunWorkout は 3 種目のシームレスな切り替えをサポートします。

let workout = SwimBikeRunWorkout(
    activities: [
        .swim(.distance(.meters(1500))),
        .bike(.distance(.kilometers(40))),
        .run(.distance(.kilometers(10)))
    ],
    displayName: "オリンピック距離トライアスロン"
)

let plan = WorkoutPlan(workout, id: "olympic-triathlon")

キーポイント:

  • activities 配列が 3 種目を順番に定義
  • 各種目に独立した目標を設定可能
  • 種目切り替え時のデータ記録をシステムが自動処理

ワークアウト app を開く(18:30

WorkoutPlan 作成後、システムのワークアウト app を開くかデータをエクスポートできます。

// Apple Watch でワークアウト app を開く
plan.openInWorkoutApp()

// JSON データとしてエクスポート
let data = try plan.dataRepresentation(as: .json)

キーポイント:

  • openInWorkoutApp() は Apple Watch 上で直接トレーニングを開始
  • dataRepresentation は JSON 形式でのエクスポートをサポート
  • iPhone から呼び出すとプランが Apple Watch に自動同期

トレーニングのスケジュール(21:00

WorkoutScheduler はトレーニングの事前計画と Apple Watch への定時同期をサポートします。

// 認可をリクエスト
await WorkoutScheduler.shared.requestAuthorization()

// 認可状態を確認
let state = WorkoutScheduler.shared.authorizationState

// トレーニングプランをスケジュール
let scheduler = WorkoutScheduler.shared
let scheduledDate = Calendar.current.date(
    byAdding: .hour,
    value: 1,
    to: Date()
)!

try await scheduler.schedule(plan, at: scheduledDate)

// スケジュール済みトレーニングを表示
let workouts = scheduler.scheduledWorkouts

// 完了としてマーク
try await scheduler.markComplete(plan, at: Date())

// スケジュールをキャンセル
try await scheduler.remove(plan, at: scheduledDate)

キーポイント:

  • 初回スケジュール前にユーザー認可をリクエストする必要がある
  • maxAllowedScheduledWorkoutCount がスケジュール可能なトレーニング数を制限
  • スケジュール済みトレーニングは Apple Watch ワークアウト app の上部に表示
  • トレーニング完了後に markComplete を呼び出してステータスを更新

サポート確認(24:15

運動タイプごとに異なる目標とアラートをサポートするため、構築前に確認してください。

// 運動タイプがサポートされているか確認
CustomWorkout.supportsActivity(.running)

// 目標がサポートされているか確認
CustomWorkout.supportsGoal(
    .heartRate(.above(160)),
    activity: .running,
    location: .outdoor
)

// アラートがサポートされているか確認
CustomWorkout.supportsAlert(
    .power(.watts(200...250)),
    activity: .cycling,
    location: .indoor
)

キーポイント:

  • 水泳はパワーとケイデンスアラートをサポートしない
  • 室内ランニングは距離目標をサポートしない(GPS 利用不可)
  • ランタイムエラーを避けるため、先に supportsGoalsupportsAlert を呼び出す

重要ポイント

  • やること:フィットネス app にカスタムトレーニングプラン機能を追加し、ユーザーがプリセットの方案でトレーニングできるようにする。価値:WorkoutKit はシステムレベルの UI を使用するため、ユーザーは新しい操作を学ぶ必要がない。始め方SingleGoalWorkout から始め、app に「トレーニングプラン作成」ボタンを追加し、段階的に CustomWorkout へ拡張。

  • やること:マラソンランナー向けにペーストレーニングプランを提供する。価値PacerWorkout はリアルタイムでペース進捗を表示し、マラソントレーニングの必須機能。始め方:「ペーストレーニング」テンプレートページを作成し、ユーザーが距離と完走時間を入力して PacerWorkout を生成し、レース日にスケジュール。

  • やること:HIIT 愛好者向けにカスタマイズ可能なインターバルトレーニングエディタを提供する。価値CustomWorkout は柔軟なフェーズ定義とリアルタイムアラートをサポートし、HIIT の構造化ニーズを完全に満たす。始め方:ドラッグ&ドロップ式の「トレーニングエディタ」を設計し、ユーザーが作業/回復フェーズを追加、目標とアラートを設定し、CustomWorkout を生成して Apple Watch に同期。

  • やること:トライアスロン選手向けにワンタップのトレーニングプランを提供する。価値SwimBikeRunWorkout は種目切り替えを自動処理し、トレーニングデータを失わない。始め方:オリンピック距離、ハーフアイアマンなどの一般的なテンプレートをプリセットし、ユーザーがワンタップで生成・スケジュール。

  • やることWorkoutScheduler でトレーニングカレンダー管理を行う。価値:ユーザーは 1 週間分のトレーニングを事前計画でき、プランが Apple Watch ワークアウト app に自動表示され、リテンションが向上。始め方:app に「トレーニングカレンダー」ビューを追加し、スケジュール済みトレーニングを CRUD 表示、scheduleremove でシステムと同期。


関連セッション

コメント

GitHub Issues · utterances