ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
WorkoutKitによるカスタムワークアウトの構築
WorkoutKitを使うと、Apple Watchのワークアウトアプリで、ワークアウト予定の作成、プレビュー、スケジュールが簡単に行えます。カスタムのインターバルを作ったり、アラートを作成したり、ビルトインのプレビューUIを使って自分自身のワークアウトルーティンをApple Watchに送信したりする方法をご確認ください。
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪
Tu:こんにちは Tu Nguyenです Workout Teamのエンジニアです 今日 同僚のAbhirajと一緒に みなさんにお話しするのは Apple Watch向けのカスタムワークアウトを 作成する方法についてです watchOS 9でワークアウトアプリに 新しいワークアウトタイプを導入しました ユーザーが理想のワークアウト体験を 作成しカスタマイズできるようになり 距離やエネルギーや時間など 単一ゴールを掲げたワークアウト つまりゴールベースのワークアウトを 作成できるようになりました ペーサーワークアウトはペースや 速度を中心に据え焦点を当てます スイム・バイク・ランワークアウトでは トライアスロン選手がなめらかに スイミングとサイクリングと ランニングを切り替えることができます そしてカスタムワークアウトは カスタムゴールとアラートを 組み合わせたステップで 構成されています iOS 17とwatchOS 10で この全タイプのワークアウトをまとめて 盛り込んだ新しいフレームワークが WorkoutKitです
WorkoutKitは 全く新しいSwiftフレームワークです 異なるワークアウトタイプのすべてを作成し カスタマイズできるようになるので ユーザーがみなさんのアプリ内でワークアウト アプリ用のワークアウトを作成できます また これらのワークアウトを ワークアウトアプリに入れて ユーザーに利用してもらうための 架け橋にもなります WorkoutKitが提供するのはプレビューUIと 予定のワークアウトを同期する機能です これら4種のワークアウトを WorkoutKitに取り入れますが 本日はカスタムワークアウトに 焦点を置きます 本セッションで確認していくのは カスタムワークアウトの作成 エクスポートのためのプレビュー そしてワークアウトの スケジュール作成方法です では最初に カスタムワークアウトの作成です カスタムワークアウトは ユーザーが体系的に ワークアウトに焦点を当てるのに ピッタリです ワークアウトを通して 一連の明確なステップで ユーザーを導いてくれます カスタムワークアウトを確認してみると 3つのステージがあります まずは ワークアウトの最初のステップで ウォームアップステップですね 次は 反復可能なブロックの 順序付けられた集まりで それぞれ独自のステップの 組み合わせが含まれています これらのブロックがワークアウトの 大半を占めています 最後は ワークアウトの最後のステップで クールダウンステップと呼んでいます ウォームアップでもクールダウンでも 反復ブロック内のステップでも 各ステップには2つの重要な 属性が含まれています 1つ目は 各ステップには 単一のゴールがあるという事です ゴールがカスタムワークアウト内の ステップの進捗を決定します ゴールが達成されると カスタムワークアウトは 次のステップへと進みます
カスタムワークアウト内のステップには 妥当な場合 時間か距離のゴールがあります オープンゴールを設定する事もできますが ユーザーが手動で 次のステップに進める必要があります
2つ目は 各ステップには 単一のアラートがある事です アラートはユーザーに 現状のパフォーマンスを示す 特定のメトリックスを知らせてくれます 例えば ユーザーの心拍が 一定基準を超えた場合 アラートを受けたいかもしれません
ペースやケイデンスやパワーと 心拍のアラートをサポートしています
ステップの構成内容が確認できたので 今度はブロックを詳しく見てみましょう
ブロックを構成するのはワークステップと リカバリーステップです ブロック内のステップには 先ほど見たように独自のゴールと アラートがあり ブロック内のステップの数や順序には 制限はありません ブロックも反復可能です ブロックの反復数も 自分の好きなように指定できます では これがApple Watchで ワークアウト中にどうなるか 見てみましょう まず ユーザーの現在のステップが ブロック内のワークステップですね このステップは 距離のゴールを掲げているので 現在のゴール進捗は 残り0.2マイルになっています このステップは現在のパワーに対する アラートも設定されており 下部に表示されています このステップでのアラートを 特定しなかった場合は ユーザーの現在の心拍が表示されます
最後に プレビューが次のステップの リカバリーステップを表示していて これは時間ベースのゴールです ステップとブロックを使えば 完全なカスタムワークアウトを作成できます
繰り返しますが 最初は ウォームアップステップがあり 次がワークとリカバリーのステップを含む 一連の反復可能なブロックで ワークアウトの大部分の時間は ここで費やされて 最後がクールダウンステップです ここで同僚Abhirajの方から WorkoutKitを使って 独自のワークアウトを作成する 方法について話してもらいます Abhiraj:こんにちは Abhirajです Workout Teamのエンジニアです Tuが言ったようにWorkoutKitを使えば ゴールやペーサーやスイム・バイク・ラン そしてカスタムのワークアウトが 作成できます 例として カスタムアウトドアサイクリング ワークアウトを確認してみましょう このワークアウトには 4つのステップがあって ウォームアップ ワークとリカバリーの2つの反復ブロック そしてクールダウンで ワークアウトが終了です ウォームアップステップには オープンゴールを使います 最初のブロックには距離のゴールと ペースアラートを ワークステップに設定して リカバリーステップには距離のゴールと 心拍アラートがあります このブロックは4回繰り返します 2番目のブロックのワークステップには 時間ゴールとパワーアラート リカバリーステップには時間ゴールと 心拍アラートです 最後のクールダウンステップは 時間ベースのゴールです これをどのようにコードで表すか 見ていきましょう まずはウォームアップステップです 最初に WorkoutKitのインポートです このウォームアップステップは アラート無しのオープンゴールでしたね ですからここでは デフォルトの イニシャライザで作成します ではワークアウトの 最初のブロックに進みましょう この最初のブロックには 2つのステップがあります 最初のステップは距離のゴールと ペースアラートのあるワークステップです
ここでHealthKitのインポートが 必要になりますが それはHKQuantityとHKUnitのゴールと アラートの表示を利用するからです これでWorkoutGoalを使って 2マイルのゴールを設定します このステップではペースアラートも加え 時速10マイルに設定します 時速10マイルのペース値で HKQuantityを作成しましょう アラートの作成には WorkoutAlertを使います WorkoutAlertの作成には WorkoutAlertTargetTypeが必要ですが この場合のターゲットは時速10マイルで この場合のWorkoutAlertTypeは 現在のペースです これでペースのWorkoutAlertが作成できます そしてワークステップを作成するのに twoMileGoalとpaceAlertを備えた タイプワークのBlockStepを使います
このブロックの2番目のステップは リカバリーステップです リカバリーにハーフマイルのゴールを作成し 心拍ゾーン1のアラートにします
これでタイプレストの リカバリーBlockStepが作成できます このワークとリカバリーのステップで ブロックが作成できるようになりました 作成には一連のステップと 繰り返し4回のIntervalBlockを使います
これで最初のブロックが完成しました それでは2番目のブロックに進みましょう このブロックでも2つのステップがあります 最初のステップは時間ゴールと パワーアラートのあるワークステップです 2分のゴールを設定します このワークブロックには 250ワットから275ワットのレンジで パワーレンジアラートを作成しましょう タイプレンジのWorkoutTargetTypeを作成し WorkoutAlertを作成します そして このゴールとアラートを使って BlockStepを作ります
このブロックの2番目のステップは リカバリーステップです 30秒のゴールを作成し 心拍ゾーン1のアラートをつけます これでリカバリーステップが作成できます
このワークとリカバリーのステップで 繰り返しを2回に設定して 2番目のブロックが作成できます
最後に クールダウンステップに 移りましょう クールダウンステップには 時間ベースのゴールが欲しかったので それを作成しましょう
タイプタイムのWorkoutGoalを作成し それを使ってCooldownStepを作成し fiveMinuteGoalのゴールを設定します では すべてをまとめましょう
これまでに作成したものをすべて使い ウォームアップステップ ブロック1 ブロック2 クールダウンステップで カスタムワークアウトの コンポジションが作成できます アクティビティタイプをサイクリングに ロケーションをアウトドアに設定します CustomWorkoutCompositionの イニシャライザのLocationTypeパラメータは オプショナルで デフォルトでは アウトドアに設定されています 全部組み合わせてカスタムワークアウトの 「My Workout」を作りましょう
なぜCustomWorkoutCompositionの イニシャライザの前に tryが付いているのか 不思議に思うかもしれませんね それはコンポジションの検証中だからです ワークアウトコンポジションの 検証の重要性について考えましょう 検証によりワークアウトの構成に 一貫性が保証され ワークアウト実行中に 問題が発生するのを防ぎます 例えば 距離ベースでないワークアウトの コンポジションに距離のゴールは 使われるべきではありません 同様に エリプティカルのような ペースと関係のないワークアウトに ペースアラートは不要です これを防ぐための 一連の検証機能があり ワークアウトアクティビティタイプ等 特定のプロパティが設定された時や 特定のAPIが実行されている時などに 機能します
追加操作のためのWorkoutComposition ラッパーも作成しました 例えば デバイス間で共有できるファイルに ワークアウトコンポジションを インポートおよびエクスポートするための APIも作成しています JSONまたはバイナリでのエクスポートは dataRepresentationを使いましょう もっと小さなサイズのコンポジションは バイナリフォーマットで エクスポートする事を奨励します それでは再び Tuにバトンタッチして コンポジションのプレビュー方法について 話してもらいましょう Tu:ありがとう Abhiraj これらのAPIを利用して カスタムワークアウトを 完全に作成できるのは素晴らしい事ですね では ワークアウトコンポジションを 作成したあとは何ができるでしょう ワークアウトコンポジションを使って WorkoutKitでは いくつか異なる事ができます まずは Abhirajが言ったように 共有及び配布用の拡張子である .workoutを使えば コンポジションをファイルに エクスポートできます 特定のAPIを呼び出すと 自動的に検証が起こりますが コンポジションのエクポートがその1つです
コンポジションのコンテンツのプレビューを ユーザーに見せるためのAPIもあります これはiOSとwatchOSでは 異なる動作を見せます
iOSでは コンポジションの プレビューAPIを呼び出すと アウトオブプロセスUIが アプリのトップに表示され ワークアウトコンポジションの コンテンツ全体を提示します この例では カスタムワークアウトの コンポジションです タイトルがトップに明確に提示され ゴールやアラートを含む ステップやブロックのリストと ユーザーがワークアウトを 自分のApple Watchの ワークアウトアプリに直接保存できる オプションが出ています 今度はwatchOSを見ると プレビューAPIを呼び出すと ワークアウトコンポジションの コンテンツを持つ ワークアウトアプリが起動します ここからユーザーはワークアウトの開始を 今かあとにするか決められます
それではAbhirajがWorkoutKitでの プレビューオプションを説明します Abhiraj:この素晴らしいワークアウトを 今度はユーザーに保存してもらいましょう 先ほど見たように WorkoutCompositionを使うと 検証のような追加操作が ワークアウトに実行できます WorkoutCompositionを使えば ユーザーにプレビューが提示できます プレビューAPIはiOSとwatchOSに最適化され ユーザーがプレビューを見たり ワークアウトを保存したり開始したり 簡単にできるようにしてくれます そこで先ほど作成した サイクリングワークアウトを使い それをWorkoutCompositionでラップします
先ほどTuが話した ワークアウトタイプはどれでも WorkoutCompositionに使えます では WorkoutCompositionの presentPreview関数を使って レビューを表示してみましょう
ここでタスクブロックを使っているのは このAPIがSwiftの モダンな並行処理機能用に デザインされているからです 先ほどあったように presentPreviewの表示する ワークアウトプレビューは 実行されているプラットフォームにより 異なります 実際に見てみましょう iOSでは この機能はアプリのトップに リモートビューを表示します ここにはワークアウトと ユーザーがそれを直接Apple Watchの ワークアウトアプリに保存できる オプションが表示されています 「Add to Watch」ボタンは新しいワークアウトで ワークアウトアプリを更新します プレビュー機能の動作は Apple Watchでは異なります アプリの上にシートを表示するのではなく watchOSのプレビュー機能を呼び出すと ワークアウトのプレビューを伴って ワークアウトアプリを起動します ここで再びTuがワークアウトの スケジューリングについて話します Tu:ありがとう Abhiraj このようなプレビューは 素早いインタラクションのために 単一のワークアウトコンポジションを ユーザーの前に出しやすくなるので 非常に便利ですね ですが 時間の経過とともに ユーザーの実行するワークアウトが 多数になった場合はどうでしょう? 例えば 今日はユーザーのスケジュールが サイクリングになっていて 週のあとの方ではハイキング その2日後ぐらいにゴルフ そして 多分休息が入ってから またサイクリングになるとします コンポジションと プレビューAPIを使って直接 ワークアウトアプリにワークアウトを 保存することもできますが これらの全ワークアウトを管理し いつ完了するのか覚えておくのは ユーザーの責任になります これではあまり スケーラブルではありません このプロセス全体を WorkoutKitの一部として単純化するために みなさんのアプリからワークアウトアプリに 直接スケジュールが書き込めます どんな感じか見てみましょう ワークアウトをスケジュールする時は アプリ用の専用スペースが ワークアウトアプリのトップにあります この専用スペースに並ぶのは Appのアイコンや名前と その日の 次のワークアウトの プレビューです ここをタップすれば直ぐに ワークアウトが表示されます
省略記号をタップすると さらに詳細が表示されて 同期した今後のスケジュール済み ワークアウトも入っています
ワークアウトのスケジューリングは ユーザーの許可が必要で 同期はローカルで行われます ユーザーが閲覧できるのは 7日前から7日後までの スケジュール済みワークアウトです 一度に同期できるのは 最大15のワークアウトで 完了したスケジュール済みワークアウトを アプリから照会できます
スケジュール済みワークアウトを 照会した場合 そこに含まれるのは みなさんが作成したコンポジションと スケジュールの日付と ワークアウトを ユーザーが完了したか否かについてです ヘルスデータは一切入っていません 完了済みのワークアウトから 実際のヘルス統計を得たい場合は HealthKit APIを参照してください WorkoutKitの一部として ワークアウトコンポジション取得のための 機能拡張を HKWorkoutに提供していますが 利用できる場合のみです 次にAbhirajが話すのは WorkoutKitを使った ワークアウトのスケジュール方法です Abhiraj:ありがとう Tu アプリがユーザーの代わりに ワークアウトをスケジュールできるよう ワークアウトアプリ内の使用に限り ワークアウトコンポジションを Apple Watchに同期しやすくする APIのセットを提供しています WorkoutKit APIを有効に使える アプリを実際に作成しましょう ワークアウトコンポジションと スケジュールの日付を関連づけて 同期する必要があります その方法をお見せします WorkoutKit APIとやりとりをする プレースホルダを持つアプリを 既に作成し始めてあります これを機能させるためにどのように WorkoutKitが利用できるでしょうか ワークアウトアプリにワークアウトを 同期し始められるようになる前に ユーザーの許可が必要です WorkoutPlanで authorizationStateを呼び出し アプリの現在の許可についてチェックできます まだ許可をリクエストしていないので ユーザーからの許可を要求するには WorkoutPlanのrequestAuthorizationを 呼び出します
「Request Authorization」ボタンを タップしますね
requestAuthorization()を呼び出すと ユーザーは同期を選択するように アラートで促されます ユーザーはiOSのWatchアプリの ワークアウト設定や watchOSの設定アプリで この設定を変更できます
これでアプリが認証されたので Apple Watchのワークアウトアプリから 現在のワークアウトプランを入手します WorkoutPlan.currentを使って Workout Planを照会できます
WorkoutPlanはアプリから スケジュールされたワークアウトを 保管したり変更したりする インターフェイスです 「Get Workout Plan」ボタンを タップしますね
ワークアウトをスケジュールしていないので プランにも何もありません
次にワークアウトを作成して スケジュールしましょう 今日はゴルフで 今週中またあとで サイクリングをしようと思います 新しいワークアウトコンポジションで そのスケジュールを作成しましょう
ScheduledWorkoutCompositionには ワークアウトコンポジションと スケジュールの日付と完了状態の オブジェクトが含まれます 今日はgolfing scheduledDateに指定し 明後日をcycling scheduledDateに 指定しました
私のアプリではどうでしょうか ご覧のようにゴルフのワークアウトが 今日にスケジュールされ 2日後にサイクリングのワークアウトが スケジュールされています これでスケジュールが作成されたので ワークアウトアプリに同期してみましょう 現在のワークアウトプランを使い 新たにスケジュールされたものを scheduledCompositions配列に追加します そしてこれらのワークアウトを ワークアウトアプリに追加するために workoutPlan.save()を呼び出します
実際の動作を見てみましょう
良いですね これで ワークアウトは同期されました Tuが言ったように ワークアウトを同期すると みなさんのアプリはワークアウトアプリの トップに専用の場所ができます どのようになるのか詳しく見てみましょう ワークアウトアプリを開けます
ご覧のように私のアプリのアイコンと 名前が表示されています 今日はゴルフがスケジュールされているので ここをタップすると ワークアウトが始まります 省略記号をタップすると もうすぐ始まるスケジュールが出ます 最初のスクリーンでは 今日の全スケジュールが見られます 「View More」をタップすると 今後7日間と前の7日間に スケジュールされたワークアウトを 見ることができます ここでは先ほど同期した 今日のワークアウトのゴルフと 次のサイクリングが出ています
これでスケジュールされたワークアウトが どのように表示されるのか そしてワークアウトアプリ内における アプリの専用スペースが分かりましたね ご存じのように私は今日 ゴルフの予定があって もうすぐ開始時間なんです
それでは失礼します 直ぐ戻りますので
戻りました 素晴らしいラウンドで 後半で72打叩きました ワークアウトアプリでスケジュールされた ワークアウトをユーザーが完了すると 完了状態が更新されます WorkoutPlan.currentを使って WorkoutPlanを照会し どのワークアウトが完了したのか 確認することができます アプリでワークアウトが 完了済みとマークされたら 完了状態を更新して ユーザーがどこでも最新情報を 保持できるようにしましょう ではコードに戻ります
このサンプルアプリではscheduled Compositionが完了したかチェックできます 完了なら それをcompleteとマークします 動作を見ましょう
自分のアプリとワークアウトアプリの同期の維持は 素晴らしいことです これで 認証要求からワークアウトアプリへの コンポジションの同期まで Workout schedule APIの実行方法の 基本がわかりましたね それでは再び Tuにお願いします Tu:ありがとう Abhiraj ゴルフが上達して嬉しいよ では みなさんのアプリに WorkioutKitを適用する際の 最善策についておさらいしましょう
ユーザーに表示したい ワークアウト体験に最適の コンポジションタイプは どれなのか考えましょう カスタムワークアウトは 非常に便利なコンポジションタイプで 特にワークアウトがカスタムゴールや アラートなどで異なるレベルの 努力や注意が必要な場合に便利です ですが 水泳はカスタムワークアウトでは サポートされていません 代わりにゴールコンポジションを 使う必要があります またアラートが利用可能なのも カスタムワークアウトのみです 30分のランニングのように 独自のアラートを指定する必要のない シンプルなワークアウトには ゴールコンポジションか ペーサーコンポジションを薦めます 必ずワークアウトコンポジションの 検証を行いましょう どんな非互換性やエラーのソースも ピンポイントできるように 非常に細かいバリデーション エラーを提供します 距離をサポートしないアクティビティが あることも忘れないように 代わりに時間やオープンゴールを 使いましょう カスタムワークアウトで特定のアラートを サポートしないアクティビティもあります 心拍ゾーンアラートのような 代わりのアラートを考えましょう
スケジュールされたワークアウトを 最新の状態に保ちましょう フォアグラウンドやバックグラウンドの ランタイムを利用しましょう アプリが必要とするかもしれません 最後になりますが フィードバックを送ってください APIを試してみてください 今日見たサンプルコードはすべて developer.apple.comで入手可能です そしてワークアウトセッションの 同期について HealthKitセッションも 是非ご確認ください ありがとうございました ♪ ♪
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。