Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

WorkoutKitでApple Watchのワークアウトを作成してみたい

WWDC23で新たにWorkoutKitが追加されています。これはApple Watchのワークアウトを作成できるもので、たとえばダイエットしたい人向けに、その人にあったワークアウトを提供するような用途として使えます。例えば、以下のようなワークアウトを作成できます。

  • 10分走って5分休憩、これを3回繰り返す
  • 3キロ走って3分休憩、これを5回繰り返す
  • 500キロカロリー消費するまで動く

説明はWWDC23のこのセッションが詳しいです。

developer.apple.com

このセッションで言われていることが実現できるのですが、秋にリリースした正式版では結構APIの形が変わっていたので注意が必要です。

BlockStepは、正式リリース時には IntervalStepに変わっていますし、WarmupStepCooldownStepはシグネチャがなくなり、IntervalStepを使うようになっています。CustomWorkoutCompositionも、CustomWorkoutに変わっています。

この辺りの対応はサンプルコードに反映されているので、セッションと合わせてサンプルコードも確認すると、正式APIでどうすれば良いのかを確認できます。

developer.apple.com

一番困ったのは、ワークアウトのプレビューを表示する方法の変化でした。 セッションでは try await workoutComposition.presentPreview() のようにプレビューを表示していたのですが、サンプルコードではSwiftUIのworkoutPreviewモディファイアとして実装されています。

iOSではプレビューはシート形式で表示されるため、モディファイアで実装されるのが自然です。しかし、Apple Watchではワークアウトアプリへのインテントとして実現されるため、モディファイアで実現されるのには違和感があり、事実このモディファイアはApple Watchでは使えませんでした。

Apple Watchではどうすればいいのかがわからなくてしばらくドキュメントと睨めっこしていたのですが、openInWorkoutAppというメソッドがWorkoutPlanに増えていたので、これを使えばいいということがわかりました。

なぜかwatchOSだけでなく、iPadOSにも対応していることになっているのが謎ですね。なんでなんでしょう・・・?