【iOS 17】Live Activityにインタラクティブな機能を追加する

iOS 17では、Live Activityに対してインタラクティブな機能を追加することができるようになりました。
本記事ではiOS 17でLive Activityに追加されたインタラクティブ機能の実現方法について書きます。
Live Activityの表示・更新・停止の方法については解説しません。
Live Activityに関する基本的な情報は以下の記事にまとめていますので、必要に応じてご参照ください。
【iOS】ActivityKitでLive Activityを表示する
インタラクティブ性の実現
Widgetにインタラクティブ機能を持たせる時と同じく、Button とToggle を使用することで、Live Activityにインタラクティブ性を持たせることができます。
処理の流れ
Live Activityでは、以下の1 ~ 4を繰り返すことでインタラクティブ性を実現することができます。
- Live Activity上の
ButtonまたはToggleをタップ -
ButtonまたはToggle初期化時に指定したIntentを実行 - Live Activityのアップデートをリクエスト
- Live Activityに表示しているViewを更新
ButtonとToggleに追加された新しいイニシャライザ
Button とToggle に新しいイニシャライザが追加されています。

ButtonまたはToggle がタップされた時に実行するIntent を初期化時に指定します。
App Intent
AppIntent プロトコルに準拠した構造体を定義することで、Intent を作成することができます。AppIntent プロトコルに準拠するためにはtitle とperform() を定義する必要があります。
perform() メソッド内にButtonまたはToggle がタップされた時に実行したい処理を記述します。
サンプルアプリの実装
今回はカウンター機能を持ったLive Activityを作成します。

Counterモデルクラス
数値をインクリメント、デクリメント、現在の数値を取得するメソッドを定義したモデルクラスを準備します。
ActivityAttributes
Live Activityに現在のカウント値をリアルタイムで表示したいため、Activity.ContentState のプロパティに、現在の数値を格納するプロパティを用意します。
Intent
IncrementIntent では数値をインクリメントする処理を、DecrementIntent では数値をデクリメントする処理を、各perform() メソッド内に記述しています。
さらに、変更を加えた数値を使用して、CounterAttributes.ContentState インスタンスを生成します。その生成したインスタンスを引数に指定してupdate(using:) を実行することで、Live Activityに表示されているボタンをタップする度に、Live Activityの表示を更新します。
Live ActivityのView
Live Activity Viewはカウント値を表示するような構成にします。
Live Activityの開始と停止
Live Activityの開始と停止を行うためのボタンを表示する画面を用意します。Live Activityの開始はrequest(attributes:contentState:pushType:) 、停止はend(_:dismissalPolicy:) を実行します。
実行結果

参考資料
・Live Activity ・Bring widgets to life ・Explore enhancements to App Intents
Discussion