Today Widgetは、通知センターまたは“Today”画面にインタラクティブな情報を直接表示するiOS拡張機能です。ユーザーはメインアプリを開くことなく、最新データ(天気、為替レート、カレンダー)を確認できます。Apple WWDC(2025)によると、iOS 17でインタラクティブウィジェットが導入された後、WidgetKitの使用量は40%増加しました。Today Widgetは情報への迅速なアクセスという課題を解決します。画面を一目見るだけで、ユーザーはアプリ内を移動することなく必要なデータを取得できます。
主要ポイント
Today Widget(通知センターウィジェットとも呼ばれる)は、アプリを起動せずにそのアプリの要約情報を表示するiOSインターフェース要素です。ユーザーはロック画面またはホーム画面で左にスワイプしてウィジェットを表示します。ウィジェットは動的データ(為替レート、最新ニュース、タスクのステータス、デバイスの状態)を表示できます。
歴史的には、Today WidgetはiOS 8で通知センターフレームワークを介して実装された通知センター拡張機能として登場しました。iOS 14でAppleはWidgetKitを導入しました。これはウィジェットをホーム画面に直接配置できる完全に再設計されたアーキテクチャです。現代の意味でのToday Widgetは、“Today”セクション(最初の画面の左側にあるウィジェットセクション)に配置されたWidgetKitウィジェットです。
主な目的は情報へのアクセス時間を短縮することです。アプリを開いてメニューを移動し、読み込みを待つ代わりに、ユーザーはすぐに必要なデータを確認できます。Apple(2024年)によると、ウィジェットを備えたアプリは27%高いユーザーエンゲージメントを示しています。追加のユースケース:クイックアクション(タスクを完了としてマーク)、モニタリング(心拍数、アクティビティ)、ステータス(バッテリー残量、通知)。
Today Widgetの開発者には2つのアプローチがあります。最新のWidgetKit(iOS 14+)とレガシーNCWidgetProviding拡張機能(iOS 8–13)です。選択は最小サポートiOSバージョンによって異なります。WidgetKitは新しいプロジェクトに推奨され、NCWidgetProvidingは古いデバイスのサポート用です。
| 特性 | WidgetKit | NCWidgetProviding |
|---|---|---|
| 最小iOS | iOS 14 | iOS 8 |
| 配置 | ホーム画面 + “Today” | “Today”のみ |
| サイズ | 小、中、大 | 固定サイズ1つ |
| インタラクティブ性 | iOS 17+のボタンとトグル | アプリを開くのみ |
| 更新 | Timeline Provider | widgetPerformUpdate |
| 言語 | SwiftUI | UIKit |
アプリがiOS 14以降をサポートしている場合はWidgetKitを使用してください。複数のサイズ、インテントによる設定、iOS 17でのリデザイン、ディープリンクなど、豊富な機能を提供します。SwiftUIの宣言的スタイルにより、ウィジェットコードはコンパクトで読みやすくなります。Timeline Providerは電力消費を考慮して更新スケジュールを自動管理します。
iOS 9–13のサポートが必要な場合のみです。NCWidgetProvidingは実装が簡単です。プロトコルを持つ通常のUIViewControllerです。ただし、サイズは1つのみ、UIKitのみ、設定不可と制限があります。Appleは古いプロジェクトでもavailability checkを使用してWidgetKitに移行することを推奨しています。iOS 14+ではWidgetKit、フォールバックとしてNCWidgetProvidingを使用します。
最新のiOSには、機能的な目的に応じて3種類のウィジェットがあります。各タイプは独自の問題を解決し、データとインターフェースデザインに異なるアプローチを必要とします。分類はアプリに適したアーキテクチャを選択するのに役立ちます。
静的または定期的に更新される情報(天気、日付、為替レート、サーバーステータス)を表示します。データはTimeline Providerを介してスケジュールに従って更新されます。ユーザーはウィジェットと対話せず、読み取りのみ行います。情報ウィジェットは実装が最も簡単で、タッチイベント処理が不要で、追加の権限なしでバックグラウンドで動作します。
iOS 17以降、WidgetKitはウィジェット内のボタン、トグル、スライダーをサポートしています。ユーザーはアプリを開かずに、タスクのマーク、音楽の一時停止、ライトのオンなどのアクションを実行できます。インタラクティブウィジェットはApp Intentsを使用してメインアプリにアクションを渡します。制限:ホーム画面のみで、iOS 18までは“Today”セクションでは使用できません。
ユーザーはシステムインターフェースを通じて表示データをカスタマイズできます。天気の都市、金融のアカウント、ニュースのカテゴリを選択します。Intents ExtensionとWidgetBundleの設定を通じて実装されます。設定可能なウィジェットは、各ユーザーにとってのパーソナライゼーションと情報の関連性を高めます。
WidgetKitを使用してSwiftUIでToday Widgetを作成するプロセスを見てみましょう。ウィジェットは自動更新で現在の為替レートを表示します。WidgetKitには3つのコンポーネントが必要です:ウィジェット構造、設定付きProvider、表示用のViewです。
import WidgetKit
import SwiftUI
@main
struct CurrencyWidget: Widget {
let kind: String = "CurrencyWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
CurrencyWidgetEntryView(entry: entry)
}
.configurationDisplayName("Currency Rate")
.description("Current USD/RUB exchange rate")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
Providerは表示用のデータを準備する役割を担います。getTimelineメソッドは更新スケジュールを作成します(次の更新は15分後)。TimelineProviderは、サーバーに常に問い合わせることなく、ウィジェットが最新データを表示することを保証します。
struct Provider: TimelineProvider {
func getSnapshot(in context: Context,
completion: @escaping (CurrencyEntry) -> Void) {
let entry = CurrencyEntry(date: Date(), rate: 92.5)
completion(entry)
}
func getTimeline(in context: Context,
completion: @escaping (Timeline<CurrencyEntry>) -> Void) {
let rate = CurrencyService().fetchRate()
let entry = CurrencyEntry(date: Date(), rate: rate)
let nextUpdate = Calendar.current.date(
byAdding: .minute, value: 15, to: Date()
) ?? Date()
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline)
}
}
Timeline ProviderはToday Widgetのデータを管理するWidgetKitの中心的なメカニズムです。タイマーによる定期的な更新(古いNCWidgetProvidingのような)の代わりに、WidgetKitはtimelineの概念を使用します。これはタイムスタンプ付きのエントリのシーケンスです。システムは現在のエントリを期限が切れるまで表示し、その後次のエントリに切り替えるか新しいエントリを要求します。
Timelineは3つのポリシーをサポートしています:.after(date) — 指定された日時に次の更新;.never — WidgetCenter.reloadAllTimelinesが明示的に呼ばれるまでウィジェットは更新されない;.atEnd — 最後のエントリを表示した後に更新。為替レートのToday Widgetの場合、15–30分間隔の.afterポリシーが最適です。エネルギー効率はWidgetKitの重要な利点です。システムはすべてのウィジェットの更新を1つのウィンドウにグループ化します。
timelineの期限が切れる前にデータが変更された場合(例えば、ユーザーがアプリでレートを更新した場合)、WidgetCenter.shared.reloadTimelines(ofKind: “CurrencyWidget”)を呼び出します。これによりProviderから新しいtimelineが要求され、表示が更新されます。WidgetCenterは1つのコマンドでアプリのすべてのウィジェットをリロードすることもできます。データ同期後に便利です。
AppleはToday Widgetのデザインに厳しい要件を課しています。コンテンツは一目で読める必要があり、不要な要素がなく、明確な階層構造が必要です。HIG(ヒューマンインターフェースガイドライン)の推奨事項に違反すると、App Storeでの公開時に却下される可能性があります。3つの原則:一見性、一貫性、階層性。
ユーザーがウィジェットに費やす時間は1秒未満です。3–4つ以上のデータ要素を追加しないでください。フォントはラベルに最低11pt、値に17ptを使用します。主要な数値には太字(Semibold)を使用します。スクロールは避けてください。Today Widgetはスクロールしません。
WidgetKitは3つのサイズをサポートしています:小(170×170pt)、中(364×170pt)、大(364×382pt)。“Today”セクションのToday Widgetでは、中サイズが最も一般的な選択です。EnvironmentValuesによるアダプティブデザイン:サイズに応じて情報密度を変更します。小は1つの数値、中は数値+グラフ、大は表を表示します。
ウィジェットは開発者の追加作業なしでライトテーマとダークテーマの両方で正しく表示される必要があります。WidgetKitは自動的にシステムカラーを取得します。ウィジェットのDynamic Typeは制限されています。フォントサイズは固定ですが、読みやすい必要があります。UIColor.labelとUIColor.systemBackgroundは、両方のテーマでテキストと背景の基本色です。
よくある質問
現在は同じWidgetKitウィジェットです。違いは配置のみです。ホーム画面と“Today”セクション(最初の画面の左側)に配置されます。iOS 14以前は、Today Widgetは通知センターでのみ動作する別個のNCWidgetProviding拡張機能でした。現在は単一のWidgetKitです。
WidgetKitはタイマーでウィジェットを更新しません。開発者がTimeline Providerを介してスケジュールを設定します(タイムスタンプ付きのエントリ)。システムは省電力を考慮して指定された時間に更新を保証します。数分遅延する場合があります。最小間隔は15分ですが、Appleは1時間に1回以下を推奨しています。
はい、iOS 17以降、WidgetKitはApp Intentsを通じてボタン、トグル、スライダーをサポートしています。インタラクティブ要素はiPhoneとiPadのホーム画面で動作します。“Today”セクションでのサポートはiOS 18で追加されました。iOS 16以前では、ウィジェットをタップするとアプリが開くのみです。
制限はありません。アプリはWidgetBundleを通じて任意の数のウィジェットを登録できます。それぞれ独自のタイプ、サイズ、設定を持ちます。ユーザーは個別に追加します。推奨は3–5個以下で、ユーザーの選択肢を過剰にしないようにします。
WidgetKitはiOS Simulatorで完全にサポートされています。XcodeでWidgetKitターゲットスキームを実行すると、シミュレータのホーム画面にウィジェットが表示されます。Timeline Providerをテストするには、WidgetKit Debug Profileを使用します。Xcode → Product → Profile → WidgetKit Debug。実際の動作は物理デバイスで確認してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。