🎮

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

2023/10/11に公開


iOS 17では、Live Activityに対してインタラクティブな機能を追加することができるようになりました。

https://developer.apple.com/documentation/widgetkit/adding-interactivity-to-widgets-and-live-activities

本記事ではiOS 17でLive Activityに追加されたインタラクティブ機能の実現方法について書きます。
Live Activityの表示・更新・停止の方法については解説しません。
Live Activityに関する基本的な情報は以下の記事にまとめていますので、必要に応じてご参照ください。

【iOS】ActivityKitでLive Activityを表示する

インタラクティブ性の実現

Widgetにインタラクティブ機能を持たせる時と同じく、ButtonToggle を使用することで、Live Activityにインタラクティブ性を持たせることができます。

処理の流れ

Live Activityでは、以下の1 ~ 4を繰り返すことでインタラクティブ性を実現することができます。

  1. Live Activity上のButton またはToggle をタップ
  2. Button またはToggle 初期化時に指定したIntent を実行
  3. Live Activityのアップデートをリクエスト
  4. Live Activityに表示しているViewを更新

ButtonとToggleに追加された新しいイニシャライザ

ButtonToggle に新しいイニシャライザが追加されています。

ButtonまたはToggle がタップされた時に実行するIntent を初期化時に指定します。

App Intent

AppIntent プロトコルに準拠した構造体を定義することで、Intent を作成することができます。AppIntent プロトコルに準拠するためにはtitleperform() を定義する必要があります。

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
https://developer.apple.com/design/human-interface-guidelines/live-activities
・Bring widgets to life
https://developer.apple.com/videos/play/wwdc2023/10028/
・Explore enhancements to App Intents
https://developer.apple.com/videos/play/wwdc2023/10103

Discussion