Today Widget: что это, виды и создание виджета уведомлений

Автор: IT Sectr Опубликовано: 2026-06-15 Время чтения: 10 мин

Today Widget — это расширение iOS, которое отображает интерактивную информацию прямо в Центре уведомлений или на экране "Сегодня". Пользователь видит актуальные данные — погоду, курс валют, календарь — без открытия основного приложения. По данным Apple WWDC (2025), использование WidgetKit выросло на 40% после внедрения интерактивных виджетов в iOS 17. Today Widget решает задачу быстрого доступа к информации: взгляд на экран — и пользователь получает нужные данные без навигации по приложению.

Главное

  • Today Widget — расширение iOS для отображения информации в Центре уведомлений.
  • WidgetKit — современный фреймворк для создания виджетов (iOS 14+).
  • NCWidgetProviding — протокол для Notification Center extensions (iOS 8–13).
  • Auto Layout — адаптация виджета под разные размеры экрана.
  • Timeline Provider — механизм обновления данных в WidgetKit.

Что такое Today Widget

Today Widget (также известный как виджет Центра уведомлений) — это элемент интерфейса iOS, который отображает сжатую информацию из приложения без его запуска. Пользователь видит виджет, смахнув экран влево на Lock Screen или на главном экране. Виджет может показывать динамические данные — курс валют, последние новости, статус задач, состояние устройства.

Исторически Today Widget появился в iOS 8 как расширение Центра уведомлений, реализованное через фреймворк Notification Center. С iOS 14 Apple представила WidgetKit — полностью переработанную архитектуру, которая позволяет размещать виджеты прямо на рабочем столе. Today Widget в современном понимании — это WidgetKit-виджет, размещённый в секции "Сегодня" (секция виджетов слева от первого экрана).

Зачем нужен Today Widget

Основная цель — сократить время доступа к информации. Вместо открытия приложения, навигации по меню и ожидания загрузки пользователь сразу видит нужные данные. По данным Apple (2024), приложения с виджетами показывают на 27% выше вовлечённость пользователей. Дополнительные сценарии: быстрые действия (отметить задачу выполненной), мониторинг (пульс, активность) и статус (заряд батареи, уведомления).

WidgetKit против NCWidgetProviding

Разработчику Today Widget доступны два подхода: современный WidgetKit (iOS 14+) и legacy-расширение NCWidgetProviding (iOS 8–13). Выбор зависит от минимальной поддерживаемой версии iOS. WidgetKit рекомендуется для новых проектов, NCWidgetProviding — для поддержки старых устройств.

ХарактеристикаWidgetKitNCWidgetProviding
Минимальная iOSiOS 14iOS 8
РазмещениеРабочий стол + "Сегодня"Только "Сегодня"
РазмерыSmall, Medium, LargeОдин фиксированный
ИнтерактивностьiOS 17+ кнопки и переключателиТолько открытие приложения
ОбновлениеTimeline ProviderwidgetPerformUpdate
ЯзыкSwiftUIUIKit

Когда использовать WidgetKit

Если ваше приложение поддерживает iOS 14 и новее — используйте WidgetKit. Он предоставляет богатые возможности: несколько размеров, конфигурацию через intent, редизайн с iOS 17 и глубокие ссылки. SwiftUI-декларативность делает код виджета компактным и читаемым. Timeline Provider автоматически управляет расписанием обновлений с учётом энергопотребления.

Когда использовать NCWidgetProviding

Только если требуется поддержка iOS 9–13. NCWidgetProviding проще в реализации — это обычный UIViewController с протоколом. Однако он ограничен: единственный размер, UIKit-only, отсутствие конфигурации. Apple рекомендует переходить на WidgetKit даже для старых проектов, используя availability check: WidgetKit на iOS 14+, NCWidgetProviding как fallback.

Типы виджетов Today Widget

В современной iOS выделяют три типа виджетов по функциональному назначению. Каждый тип решает свою задачу и требует разного подхода к проектированию данных и интерфейса. Классификация помогает выбрать правильную архитектуру для вашего приложения.

Информационные виджеты

Отображают статическую или периодически обновляемую информацию: погода, дата, курс валют, статус сервера. Данные обновляются по расписанию через Timeline Provider. Пользователь не взаимодействует с виджетом — только читает. Информационные виджеты — самые простые в реализации, не требуют обработки touch-событий и работают в фоновом режиме без дополнительных разрешений.

Интерактивные виджеты

С iOS 17 WidgetKit поддерживает кнопки, переключатели и слайдеры в виджетах. Пользователь может выполнить действие — отметить задачу, поставить музыку на паузу, включить свет — без открытия приложения. Interactive Widgets используют App Intents для передачи действия в основное приложение. Ограничение: только на рабочем столе, не в секции "Сегодня" до iOS 18.

Конфигурируемые виджеты

Пользователь настраивает отображаемые данные через системный интерфейс — выбирает город для погоды, аккаунт для финансов, категорию для новостей. Реализуется через Intents Extension и конфигурацию в WidgetBundle. Конфигурируемые виджеты повышают персонализацию и релевантность информации для каждого пользователя.

Создание виджета WidgetKit

Рассмотрим процесс создания Today Widget на SwiftUI с использованием WidgetKit. Виджет будет отображать текущий курс валюты с автоматическим обновлением. WidgetKit требует три компонента: структуру виджета, Provider с конфигурацией и View для отображения.

swift
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 гарантирует, что виджет показывает актуальные данные без постоянного опроса сервера.

swift
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 и обновление данных

Timeline Provider — центральный механизм WidgetKit для управления данными Today Widget. Вместо периодического обновления по таймеру (как в старом NCWidgetProviding), WidgetKit использует концепцию timeline — последовательности записей с метками времени. Система отображает текущую запись до её истечения, затем переключается на следующую или запрашивает новую.

Политики обновления

Timeline поддерживает три политики: .after(date) — следующее обновление в указанную дату; .never — виджет не обновляется до явного вызова WidgetCenter.reloadAllTimelines; .atEnd — обновление после отображения последней записи. Для Today Widget с курсом валют оптимальна политика .after с интервалом 15–30 минут. Энергоэффективность — ключевое преимущество WidgetKit: система группирует обновления всех виджетов в одном окне.

WidgetCenter: программное обновление

Если данные изменились до истечения timeline (например, пользователь обновил курс в приложении), вызовите WidgetCenter.shared.reloadTimelines(ofKind: "CurrencyWidget"). Это запросит новый timeline у Provider и обновит отображение. WidgetCenter также позволяет перезагрузить все виджеты приложения одной командой — удобно после синхронизации данных.

Рекомендации по дизайну виджетов

Apple предъявляет строгие требования к дизайну Today Widget: контент должен быть читаем на расстоянии, без лишних элементов и с чёткой иерархией. Нарушение рекомендаций HIG (Human Interface Guidelines) — причина отказа при публикации в App Store. Три принципа: glanceability, consistency и hierarchy.

Glanceability — читаемость с одного взгляда

Пользователь тратит на виджет меньше секунды. Не добавляйте больше 3–4 элементов данных. Шрифт — минимум 11pt для меток, 17pt для значений. Используйте жирное начертание (Semibold) для ключевых чисел. Избегайте прокрутки — Today Widget не скроллится.

Адаптация под размеры

WidgetKit поддерживает три размера: Small (170×170pt), Medium (364×170pt), Large (364×382pt). Для Today Widget в секции "Сегодня" Medium — наиболее частый выбор. Адаптивный дизайн через EnvironmentValues: изменяйте плотность информации в зависимости от размера. Small — одно число, Medium — число + график, Large — таблица.

Поддержка тёмной темы и Dynamic Type

Виджет должен корректно отображаться в светлой и тёмной теме без дополнительных действий разработчика — WidgetKit автоматически подхватывает системные цвета. Dynamic Type для виджетов ограничен: размер шрифта фиксирован, но должен быть читаемым. UIColor.label и UIColor.systemBackground — базовые цвета для текста и фона в обеих темах.

Часто задаваемые вопросы

Чем Today Widget отличается от обычного виджета на рабочем столе?

Сегодня это один и тот же WidgetKit-виджет. Разница только в расположении: на рабочем столе и в секции "Сегодня" (слева от первого экрана). До iOS 14 Today Widget был отдельным расширением NCWidgetProviding, которое работало только в Центре уведомлений. Сейчас это единый WidgetKit.

Как часто обновляется Today Widget?

WidgetKit не обновляет виджеты по таймеру. Разработчик задаёт расписание через Timeline Provider: записи с метками времени. Система гарантирует обновление в указанное время с учётом энергосбережения — может задержать на несколько минут. Минимальный интервал — 15 минут, но Apple рекомендует не чаще 1 раза в час.

Можно ли сделать Today Widget с интерактивными кнопками?

Да, начиная с iOS 17 WidgetKit поддерживает кнопки, переключатели и слайдеры через App Intents. Интерактивные элементы работают на рабочем столе iPhone и iPad. В секции "Сегодня" поддержка появилась в iOS 18. Для iOS 16 и старше — только открытие приложения при нажатии на виджет.

Сколько Today Widgets может быть в одном приложении?

Ограничений нет. Приложение может зарегистрировать любое количество виджетов через WidgetBundle — каждый со своим типом, размером и конфигурацией. Пользователь добавляет их по отдельности. Рекомендуется не более 3–5 виджетов, чтобы не перегружать выбор пользователя.

Как тестировать Today Widget на симуляторе?

WidgetKit полностью поддерживается в iOS Simulator. Запустите схему WidgetKit target в Xcode — виджет появится на рабочем столе симулятора. Для проверки Timeline Provider используйте WidgetKit Debug Profile: Xcode → Product → Profile → WidgetKit Debug. Реальное поведение проверяйте на физическом устройстве.

Итоги

  • Today Widget — расширение iOS для отображения информации без открытия приложения.
  • WidgetKit (iOS 14+) — современный фреймворк, NCWidgetProviding — legacy для старых версий.
  • Три типа виджетов: информационные, интерактивные (iOS 17+), конфигурируемые через Intents.
  • Timeline Provider управляет расписанием обновлений вместо таймеров.
  • Дизайн должен быть glanceable: минимум элементов, крупный шрифт, адаптация под размеры.
  • Интерактивность через App Intents — кнопки и переключатели без открытия приложения.
  • WidgetCenter.shared.reloadTimelines — программное обновление при изменении данных.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также