Slide 1

Slide 1 text

選挙速報を多くのユーザーへ 届ける Live Activities 設計 iOSDC Japan 2026 / ⽇本経済新聞社 齋藤健悟

Slide 2

Slide 2 text

⽇経電⼦版アプリにて Live Activities による 選挙開票速報を実施 @2025年参院選, 2026年衆院選 ロック画面 Dynamic Island Apple Watch 2

Slide 3

Slide 3 text

従来の⽇経電⼦版アプリの選挙対応 @2024年以前 ⽇経電⼦版アプリではWebの 選挙特設ページを表⽰していた ユーザーはアプリを開けば最新情報が取得できる 3

Slide 4

Slide 4 text

アプリ独⾃の対応は Push 通知がメインだった Push 通知で速報をお知らせ → 選挙情勢に合わせて速報を出したい → 通知が多いと許諾率も下がる もっとアプリの体験を⾼められないか? 4

Slide 5

Slide 5 text

WWDC24 で Live Activities の Update - iOS 18 で Broadcast 配信に対応 - ⼤規模配信向けに機能が強化された! - watchOS 11 でも Live Activities の UI が表⽰できるようになった これは選挙開票速報で活⽤できそう! https://developer.apple.com/jp/videos/play/wwdc2024/10069/ https://developer.apple.com/videos/play/wwdc2024/10068/ 5

Slide 6

Slide 6 text

2024年衆院選で社内検証を実施 実際の選挙データと繋いで体験を確認 情報が⾃動更新される ⾃然と⽬に⼊るUXを確認できた! → 次の選挙に向けて準備を⾏っていた 6

Slide 7

Slide 7 text

Apple News でも Live Activities が利⽤されていた 2024年⽶国⼤統領 選挙開票速報が で利⽤された 選挙でも Live Activities を 使う流れを確信! https://apps.apple.com/us/app/apple-news/id1066498020 7 https://www.macrumors.com/2024/11/05/apple-news-us-election-results-iphone/

Slide 8

Slide 8 text

開票速報を実現する際に重要な要件 素早く 正確に 情報を届ける 8

Slide 9

Slide 9 text

要件を達成するための2つの対応 ⼤規模配信への対応 負荷を抑えながら素早く更新 ⻑時間表⽰への対応 安定して更新を続け、正確性を担保 開発と検証を重ね、 ⼤規模‧⻑時間の配信に適した実装を確⽴ 9

Slide 10

Slide 10 text

本発表のスコープ Live Activities 選挙開票速報に特化した事例を紹介 1. ⼤規模配信への対応 a. 通知サーバーの運⽤負荷 b. 更新時のアクセス集中 2. ⻑時間表⽰への対応 a. 8時間の更新停⽌に対応 b. ⾮表⽰に対応 全般の理解は WWDC26 “ライブアクティビティの基本” をご覧ください https://developer.apple.com/jp/videos/play/wwdc2026/223/ 10

Slide 11

Slide 11 text

1. ⼤規模配信への対応 個別配信 / ⼤規模配信の 2つの利⽤例から⾒ていきましょう 11

Slide 12

Slide 12 text

Live Activities の利⽤例 Google Mapsでは到着予想時刻を表⽰ Apple Sports ではスポーツ結果を表⽰ 端末ごとの個別の情報を表⽰ ⼤規模に同じ情報を表⽰ Google Maps(Google Inc.) https://apps.apple.com/jp/app/google-%E3%83%9E %E3%83%83%E3%83%97/id585027354 Apple Sports(Apple Inc.) https://apps.apple.com/jp/app/apple-sports/id6446 788829 12

Slide 13

Slide 13 text

個別配信と⼤規模配信の違い 更新データ (スポーツ情報 ) 更新データ (ナビ情報) 端末ごとに任意のタイミングで送信 iPhone iPhone iPhone Live Activity 多数の端末へ同時に送信 選挙開票速報はこちら! https://apps.apple.com/jp/app/google-%E3%83%9E%E3%83%83%E3%83%97/id585027354 13 https://apps.apple.com/jp/app/apple-sports/id6446788829

Slide 14

Slide 14 text

Token を利⽤した更新 - 事前の登録 iOS 16.1 + で利⽤可能 Apple APNs ① Live Activity 更新⽤の Token を取得 通知サーバー ② Token を送信、保存 Live Activity 14

Slide 15

Slide 15 text

Token を利⽤した更新 - 情報の送信 - Apple APNs ③ Token と Payload を送信 ④ Payload を受信 表⽰を更新 Live Activity 通知サーバー 個別配信が実現しやすい 15

Slide 16

Slide 16 text

Token 利⽤の更新を⼤規模配信で利⽤する 通知サーバーから、 Apple APNs 多数の端末に向けて送信する 端末の Token の管理、 送信スケジューラの仕組みの考慮 が必要となる 通知サーバー Live Activity 16

Slide 17

Slide 17 text

“Broadcast 配信” 17

Slide 18

Slide 18 text

同じ情報を Broadcast 配信で⼤規模に送信 iOS 18から利⽤が可能になった Token の代わりに APNs で Channel を⽤意する 18

Slide 19

Slide 19 text

同じ情報を Broadcast 配信で⼤規模に送信 通知サーバー APNs Channel 購読 iPhone iPhone iPhone iPhone App 端末は⼀つの Channel を購読する 19

Slide 20

Slide 20 text

同じ情報を Broadcast 配信で⼤規模に送信 APNs Channel 通知サーバー Payload 購読 iPhone iPhone iPhone iPhone App サーバーは Channel に対して更新データを⼀度送信する 端末ごとの Token 管理と、送信スケジューラの考慮が不要に! 20

Slide 21

Slide 21 text

更新⽅式の⽐較 Token 利⽤の更新 Broadcast 配信 対応 iOS iOS 16.1+ iOS 18.0+ 配信先 Live Activity ごとの Token 共通 Channel ID 通知サーバー からの送信数 端末数に⽐例 1回で多数の端末へ 最適な使い⽅ 個別配信 ⼤規模配信 選挙開票速報では Broadcast 配信を利⽤した 21

Slide 22

Slide 22 text

選挙開票速報のデータモデル 静的な情報 タイトル表⽰ 過半数表⽰ 動的な情報 議席数 記事タイトル, URL 22

Slide 23

Slide 23 text

選挙開票速報のデータモデル 静的な情報 ActivityAttributes で定義 Live Activity 初期化時に渡す 動的な情報 ContentState で定義 更新時に渡す 変更される情報のみを送信し効率的に View を更新する Payload は 4 KB が上限、動的な情報を最低限に抑える 23

Slide 24

Slide 24 text

配信時はアプリから API を呼ばずに View を更新 - Broadcast 配信で、APNs から Payload を受信 - Payload の ContentState で View を再描画 → 更新ごとのAPIリクエストが不要になり、アクセス集中を回避 24

Slide 25

Slide 25 text

選挙対応での Live Activities の開始と配信 Live Activities を表⽰開始 Broadcast 配信 アプリ起動時に Live Activity 1. 更新を実施 開始⽤のデータを取得 2. ⾮表⽰にも対応 アプリ向け API iPhone App 通知サーバー APNs Channel iPhone iPhone iPhone iPhone App 25

Slide 26

Slide 26 text

開始処理 アプリ起動 / フォアグラウンド時に開始情報を取得 得られた開始情報で Live Activity を開始 ⚠ Broadcast 配信で開始することはできない 26

Slide 27

Slide 27 text

⾮表⽰処理 Broadcast 配信で Live Activity を即時⾮表⽰にできる Payload に下記を設定 - event: “end” - dismissal-date: 1 - 現在時刻より過去に設定する 27

Slide 28

Slide 28 text

更新の制約: バジェット管理 - 更新にはバジェットがあり、超過すると更新が遅延 - 更新 priority: high を使⽤すると即時反映ができるが、 バジェットが消費される - Info.plist で ”より頻繁なアップデート” 設定をすることで バジェットを増やせる - “NSSupportsLiveActivitiesFrequentUpdates” 28

Slide 29

Slide 29 text

Live Activities は UI に許可ダイアログが表⽰される Live Activities 表⽰の許可 初回のタイミングで表⽰ “より頻繁なアップデート” 設定の許可 検証では1~2時間後に表⽰された どちらも、アプリインストール時は許可状態となっている 29

Slide 30

Slide 30 text

2. ⻑時間表⽰への対応 30

Slide 31

Slide 31 text

Live Activities は⻑時間利⽤に制約がある Live Activities を⾮表⽰にする4パターン 1. Broadcast 配信 2. アプリ / AppIntent から 3. ユーザー操作 a. 通知と同様に横スワイプで消せる 4. システムが時間経過で⾮表⽰にする 31

Slide 32

Slide 32 text

Live Activities の時間制約 1. 表⽰から8時間後に、更新ができなくなる 2. 表⽰から12時間後に、⾮表⽰となる → 4時間の間は、更新されないままロック画⾯に表⽰が残る 表⽰開始 12時間後 ⾮表⽰ 8時間後 更新可能 更新不可 32

Slide 33

Slide 33 text

2026年衆議院選挙の投開票⽇ 当⽇のスケジュール - 投開票⽇ 2/8 20:00 - 開票が始まる - Live Activities 表⽰を開始 - 翌⽇ 2/9 9:30ごろ - 開票が終了したことを確認 - Live Activities 表⽰を終了 33

Slide 34

Slide 34 text

開票速報は⼀晩かかるコンテンツ 8時間経過で更新が停⽌する場合 開票途中の Live Activity がそのまま残ってしまう → 不正確な情報のまま残る、速報性も失われてしまう 34

Slide 35

Slide 35 text

Live Activity を再⽣成しよう 8時間経過 ボタン押下 時間経過でボタンを表⽰ 再⽣成して 更新ができるように! 35

Slide 36

Slide 36 text

Live Activity を再⽣成しよう 再⽣成の選択肢 1. Live Activity タップ時にアプリを起動し、再⽣成 2. Live Activity 上のボタン押下で、再⽣成 36

Slide 37

Slide 37 text

再読み込みボタンの表⽰判定 表⽰開始 開始時刻を 静的データで保持 Broadcast 配信 View 更新 表⽰開始から 8時間経過? 再読み込みボタン表⽰ Yes No 配信データで更新 37

Slide 38

Slide 38 text

再⽣成処理の実装 1. 再⽣成の AppIntent を Button に設定 a. Live Activities は WidgetExtension で動くので AppIntent で処理を実⾏ b. LiveActivityIntent を使⽤ i. バックグラウンドでも、Live Activity を開始することができる 2. AppIntent 処理 a. 表⽰中の Live Activity を⾮表⽰ b. Live Activity を新規に⽣成 38

Slide 39

Slide 39 text

Live Activities の再⽣成によってできたこと - 不正確な情報が残らないように - ユーザーが必要なタイミングで、最新の情報が取得できるように 39

Slide 40

Slide 40 text

“Live Activities が消せない‧‧‧” スワイプで消せるOSの仕様だが、初⾒ではわかりづらい ロック画⾯、Dynamic Island に ⼀晩中表⽰され続ける 消したいユーザーにも配慮したい! 40

Slide 41

Slide 41 text

閉じるボタンを設置 - AppIntent で表⽰中の Live Activity を⾮表⽰ - アプリ起動時に再表⽰されないように、 同じ Live Activity は表⽰しない 誰でも直感的に⾮表⽰にできるようになった! 41

Slide 42

Slide 42 text

選挙開票速報 Live Activity のライフサイクル 20時 開票開始 アプリ起動時 Live Activity 開始 ⾼頻度に データ更新 Broadcast 配信 8時間経過時 ユーザー操作で 再生成 翌朝9時30分ごろ 議席が確定 Broadcast 配信 非表示 42

Slide 43

Slide 43 text

選挙開票速報 Live Activities 設計ポイント ⼤規模配信への対応 Broadcast 配信を活⽤し、Token の管理を不要に → 通知送信サーバーの運⽤コストを削減 表⽰に必要な情報を最⼩限の Payload に集約 → 更新のたびに API リクエストを⾏わず、アクセス集中を回避 ⻑時間表⽰への対応 AppIntent による再⽣成、削除の仕組みを⽤意 → 必要なユーザーが最新表⽰を継続的に取得できる 43

Slide 44

Slide 44 text

Live Activities の広がるタッチポイント - iPhone - ロック画⾯ - Dynamic Island - Standby - Apple Watch - Smart Stack (watchOS 11) - CarPlay - ダッシュボード (iOS 26) - Mac (iPhone Mirroring) - メニューバー (macOS 26) 44

Slide 45

Slide 45 text

皆さんのプロダクトにも Live Activities を取り⼊れてみてください! 45

Slide 46

Slide 46 text

NIKKEI Tech Talk #50 信頼されるニュース体験を⽀える技術 〜iOS27 新機能活⽤とAndroid 継続的 改善の取り組み〜 46