ハイライト
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")
キーポイント:
WorkoutStepはgoalとalertを含む単一フェーズを定義WorkoutGoalは distance、time、energy、open の 4 タイプをサポートWorkoutAlertは速度、心拍数、パワー、ケイデンスのリアルタイムフィードバックを提供IntervalBlockはiterationsで繰り返し回数を制御warmupとcooldownはオプション
トレーニングアラートタイプ(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 利用不可)
- ランタイムエラーを避けるため、先に
supportsGoalとsupportsAlertを呼び出す
重要ポイント
-
やること:フィットネス app にカスタムトレーニングプラン機能を追加し、ユーザーがプリセットの方案でトレーニングできるようにする。価値:WorkoutKit はシステムレベルの UI を使用するため、ユーザーは新しい操作を学ぶ必要がない。始め方:
SingleGoalWorkoutから始め、app に「トレーニングプラン作成」ボタンを追加し、段階的にCustomWorkoutへ拡張。 -
やること:マラソンランナー向けにペーストレーニングプランを提供する。価値:
PacerWorkoutはリアルタイムでペース進捗を表示し、マラソントレーニングの必須機能。始め方:「ペーストレーニング」テンプレートページを作成し、ユーザーが距離と完走時間を入力してPacerWorkoutを生成し、レース日にスケジュール。 -
やること:HIIT 愛好者向けにカスタマイズ可能なインターバルトレーニングエディタを提供する。価値:
CustomWorkoutは柔軟なフェーズ定義とリアルタイムアラートをサポートし、HIIT の構造化ニーズを完全に満たす。始め方:ドラッグ&ドロップ式の「トレーニングエディタ」を設計し、ユーザーが作業/回復フェーズを追加、目標とアラートを設定し、CustomWorkoutを生成して Apple Watch に同期。 -
やること:トライアスロン選手向けにワンタップのトレーニングプランを提供する。価値:
SwimBikeRunWorkoutは種目切り替えを自動処理し、トレーニングデータを失わない。始め方:オリンピック距離、ハーフアイアマンなどの一般的なテンプレートをプリセットし、ユーザーがワンタップで生成・スケジュール。 -
やること:
WorkoutSchedulerでトレーニングカレンダー管理を行う。価値:ユーザーは 1 週間分のトレーニングを事前計画でき、プランが Apple Watch ワークアウト app に自動表示され、リテンションが向上。始め方:app に「トレーニングカレンダー」ビューを追加し、スケジュール済みトレーニングを CRUD 表示、scheduleとremoveでシステムと同期。
関連セッション
- Build custom swimming workouts with WorkoutKit — WorkoutKit で水泳トレーニングを構築する詳細ガイド。プールと公開水域の異なる設定を含む
- What’s new in HealthKit — WorkoutKit と組み合わせてトレーニングデータを取得する HealthKit の最新機能と更新を確認
- What’s new in watchOS — ワークアウト app の改善を含む watchOS のシステムレベルの新機能を探索
コメント
GitHub Issues · utterances