✈️

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

2022/11/11に公開

ActivityKitはLive Activityを開発するためのフレームワークです。Live Activityとは、Appの最新情報をロック画面やDynamic Islandに表示するための機能で、Appを起動していなくても最新の情報をユーザに提供することができます。

本記事ではDynamic Islandとロック画面にLive Activityを表示し、表示内容の更新、表示を停止するための実装方法について書きます。

Live Activityの表示形状タイプ

Live Activityの表示形状タイプはいくつかの種類があります。アクティブなLive Activityの数や、画面の表示状態によってiOSが表示形状タイプを自動的に切り替えます。

Compact


アクティブなLive Activityが一つだけの時、Live ActivityはCompactタイプで表示されます。Compactタイプは2つのView領域で構成されています。1つはTrueDepthカメラの前端のLeading side、もう1つは末尾側のTrailing sideです。

Minimal


アクティブなLive Activityが二つ以上の時、Live ActivityはMinimalタイプで表示されます。先に実行されたLive Activityがattached領域に、後に実行されたLive Activityがdetached領域に表示されます。

Expanded


Live Activityをロングタップした時、Live ActivityはExpandedタイプで表示されます。Expandedタイプは複数のView領域で構成されており、Compactタイプと比べてより多くの情報を表示することができます。

ロック画面


ロック画面時は画面下部にLive Activityが表示されます。

Live Activityの実装

Live Activityを実装するには、既に追加されたWidget Extension内のソースファイルにコードを追加するか、新規でWidget Extensionをプロジェクトに追加する必要があります。Live ActivityのユーザインターフェースはWidgetKitとSwiftUIを使用して構築します。

Widget Extensionの追加

AppにLive Activityを追加するために、Widget Extensionをプロジェクトに追加します。File -> New -> Targetの順に選択すると以下のようなターゲット一覧ダイアログが表示されます。

この中からWidget Extensionを選択すると、Widget Extensionに関する情報を入力するダイアログが表示されます。Product Nameに任意の名前を指定、Include Live Activityにチェックをつけます。

Live Activityの有効化

ホストApp側のInfo.plistファイルにSupports Live Activitiesキー(NSSupportsLiveActivities )を追加し、対応する値にYES を設定します。

Live Activityに表示する情報の定義

Live Activityに表示する情報はActivityAttributes に準拠した構造体で定義します。静的な情報は構造体のプロパティで定義し、動的な情報は構造体内で定義したCodable , Hashable プロトコルに準拠するContentState 構造体のプロパティで定義します。

Live Activityの定義

Live ActivityはWidget プロトコルに準拠した構造体で定義し、body プロパティにActivityConfiguration オブジェクトを返すコードを記述します。for 引数には前項で作成したActivityAttributes に準拠した構造体名を指定します。第二引数にはActivityViewContext< Attribute > オブジェクトを引数とする、ロック画面に表示するLive Activity Viewを返すクロージャを指定します。ActivityViewContext< Attribute > にはLive Activityに表示するための情報が格納されており、クロージャ内でLive Activity Viewを生成する時に使用することができます。最後のdynamicIsland 引数には、ActivityViewContext< Attribute > を引数とするDynamicIsland 型のオブジェクトを返すクロージャを指定します。

DynamicIsland

DynamicIsland 型のオブジェクトにDynamicIslandで表示するViewを定義します。

Compact


compactLeading 引数にはLeading side領域に表示したいViewを返すクロージャを 、compactTrailing 引数にはTrailing side領域に表示したいViewを返すクロージャを指定します。

Expanded


Leading、Trailing、Center、Bottom各領域に表示するViewを返すクロージャを引数に設定した、DynamicIslandExpandedRegion 型のオブジェクトを生成し、DynamicIsland クラスの引数に指定します。

以上でLive Activityの実装は完了です。
Live Activityはホーム画面/ロック画面ウィジェットと違い、タイムラインは存在しません。Live Activityを開始するには、ホストAppでLive Activity開始のリクエスト処理を行う必要があります。

Live Activityの開始

iOS 16.1以前

Live Activityを開始するために、Live Activityに表示する情報を生成します。
DeliveryAttributes オブジェクトに静的な情報を、DeliveryAttributes.ContentState に動的な情報を引数に指定してオブジェクトを生成します。生成したそれぞれのオブジェクトをActivity クラスのrequest メソッドの引数に指定して実行するとLive Activityが開始します。

iOS 16.2以降

iOS 16.2以降からは、request メソッドの引数contentState:content: に変更されました。content: にはActivityContent<Activity<Attributes>.ContentState> オブジェクトを指定します。上記のサンプルコードでは省略形で記述していますが、省略なしで記述した場合、以下のようなコードになります。

ActivityContent<Activity<Attributes>.ContentState>init の引数state: にはContentState オブジェクトを、staleDate: には表示しているLive ActivityのActivityStatestale に変更する日付をDate? オブジェクトで指定します。ActivityStatestale に変更する必要がない時は、nil を指定します。

Live Activityの更新

iOS 16.1以前

DeliveryAttributes.ContentStateを生成し、Activity クラスのupdate メソッドの引数に指定して実行するとLive Activityに表示する情報を更新することができます。

iOS 16.2以降

iOS 16.2以降からは、update メソッドの引数using:content: に変更されました。content: にはActivityContent<Activity<Attributes>.ContentState> オブジェクトを指定します。

Live Activityの停止

iOS 16.1以前

DeliveryAttributes.ContentState を生成し、Activity クラスのend メソッドの引数に指定して実行するとLive Activityを停止することができます。

iOS 16.2以降

iOS 16.2以降からは、end メソッドの引数using:content: に変更されました。content: にはActivityContent<Activity<Attributes>.ContentState> オブジェクトを指定します。

ホストApp側のサンプルソースは以下になりますので、必要に応じてご参照ください。

iOS 16.1以前

iOS 16.2以降

参考情報

Dynamic Islandサイズ仕様

表示形状タイプ 機種 Dynamic Islandの幅 (pt)
Compact or minimal iPhone 14 Pro Max 250
iPhone 14 Pro 230
Expanded iPhone 14 Pro Max 408
iPhone 14 Pro 371

Live Activityサイズ仕様

画面解像度 (ポートレート) Compact leading Compact trailing Minimal Expanded ロック画面
430x932 62.33x36.67 62.33x36.67 36.67–45x36.67 408x84–160 408x84–160
393x852 52.33x36.67 52.33x36.67 36.67–45x36.67 371x84–160 371x84–160

参考資料

ActivityKit
https://developer.apple.com/documentation/activitykit

Human Interface Guidelines > Live Activities.
https://developer.apple.com/design/human-interface-guidelines/components/system-experiences/live-activities

Discussion