【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