
Swiftでリアルタイムな情報をロック画面に表示したいときに便利なのが ActivityKit です。
スポーツのスコアや配達状況、移動経路など、時間とともに変化するデータを、ユーザーのデバイスのロック画面やDynamic Islandにライブで表示できます。
この記事では ActivityKit の基本的な意味や使い方、主要なプロパティやメソッド、注意点までわかりやすく解説します。
ActivityKitとは?
ActivityKit は、iOS 16.1以降で利用できるApple純正のフレームワークで、Live Activities(ライブアクティビティ)を通じてリアルタイム情報をユーザーに届ける仕組みを提供します。
ライブアクティビティとは、例えば、「フードデリバリーの進行状況」や「スポーツのスコア速報」など、刻々と変化する情報をロック画面やDynamic Island上に継続的に表示できるUI機能です。
アプリがバックグラウンドにいても、システムに情報を預けて表示し続けられるのが特徴です。
具体例:配送状況を表示するLive Activity
下記のようなシンプルなLive Activityのデータ構造を定義します。
|
1 2 3 4 5 6 7 8 9 10 11 |
import ActivityKit struct DeliveryAttributes: ActivityAttributes { public struct ContentState: Codable, Hashable { var deliveryStage: String var estimatedArrival: Date } var orderNumber: String } |
そして、Live Activityを開始するには次のようなコードを使います。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
let attributes = DeliveryAttributes(orderNumber: "AB123") let state = DeliveryAttributes.ContentState( deliveryStage: "配達中", estimatedArrival: Date().addingTimeInterval(1800) ) let activity = try? Activity<DeliveryAttributes>.request( attributes: attributes, contentState: state, pushType: nil ) |
このように、静的情報(注文番号など)と変化する情報(配達ステータスなど)を分けて管理しながら表示できます。
主要なプロパティとメソッド
ActivityKitを使いこなすには、いくつかの主要なクラスやメソッドの意味を理解しておく必要があります。
| 名称 | 役割 |
|---|---|
ActivityAttributes |
Live Activity用のベース属性プロトコル。構造体で定義する |
ContentState |
表示すべき状態(時間とともに変化)を管理するサブ構造体 |
Activity.request() |
Live Activityの開始に使うメソッド |
Activity.update() |
表示中のLive Activityを更新するメソッド |
Activity.end() |
Live Activityを終了するためのメソッド |
Activity<ActivityType>.activities |
現在動作中のLive Activity一覧にアクセス可能 |
ActivityConfiguration |
SwiftUIでLive Activityの表示レイアウトを記述するためのView構造体 |
Live ActivityのUIはどう作る?
ActivityKitの表示内容は SwiftUI で構築します。
以下のような構成になります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import ActivityKit import WidgetKit import SwiftUI @main struct MyLiveActivityWidget: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: DeliveryAttributes.self) { context in // ロック画面などのUI VStack { Text("配送状況: \(context.state.deliveryStage)") Text("到着予定: \(context.state.estimatedArrival.formatted())") } .padding() } dynamicIsland: { context in DynamicIsland { DynamicIslandExpandedRegion.center { Text("🚚 配達中 \(context.state.deliveryStage)") } } compactLeading: { Text("配達") } compactTrailing: { Text("中") } minimal: { Text("🚚") } } } } |
ロック画面とDynamic Islandで異なるUIを記述でき、ユーザーに適切な情報を届けられます。
ActivityKitの活用シーン
ActivityKit は次のようなケースで非常に便利です。
- フードデリバリーの進行状況を表示(例:UberEats風UI)
- スポーツのスコアや試合の進行表示
- タクシーや配車の現在地や到着予定表示
- タイマーやカウントダウン系の情報表示
- 通販の配送状況(出荷・配達中・到着済など)
- ミュージックプレイヤーの再生状況などの進行情報
ActivityKitを使うときの注意点
便利な一方で、いくつかの前提条件や制約にも注意が必要です。
- iOS 16.1 以降が必要(古いOSでは使えません)
- 表示には WidgetExtension が必要(ActivityConfiguration を記述する必要あり)
- 通知ベースではなくシステムに表示を委ねる設計のため、更新頻度には制限あり(最大15分間隔)
- 状態管理は ContentState にすべて集約しておく必要あり
- ユーザーがLive Activityの使用を許可していないと表示されない
また、ユーザー体験としても「情報の出しすぎ」に注意し、必要なときにだけLive Activityを表示する配慮も大切です。
まとめ
今回は ActivityKit の基本的な使い方から活用シーン、主要なプロパティ・メソッド、注意点まで詳しく紹介しました。
- ActivityKitは、iOS 16.1以降で使えるLive Activity表示のためのフレームワーク
Activity.request()で開始し、update()・end()で状態管理できる- 表示UIは SwiftUI + Widget Extension で定義
- 配送やスコア速報、タイマーなどリアルタイム表示に最適
- OS制約や更新間隔、ユーザーの許可状態には注意が必要
アプリの体験を「リアルタイム」「今ここ」の価値で強化したいときに、ぜひ ActivityKit を活用してみてくださいね!
