WidgetKit
WidgetKit — это программный фреймворк, разработанный компанией Apple Inc. для операционных систем iOS, iPadOS, macOS и watchOS, предназначенный для создания, отображения и обновления виджетов на экранах устройств. Виджеты, созданные с помощью WidgetKit, представляют собой компактные, интерактивные элементы интерфейса, которые отображают актуальную информацию (например, погоду, календарь, новости, данные фитнес-трекеров) на главном экране, экране блокировки или в Центре уведомлений, не требуя полного запуска приложения. Фреймворк был анонсирован на Всемирной конференции разработчиков (WWDC) в 2020 году и стал доступен с выходом iOS 14, iPadOS 14, macOS Big Sur и watchOS 7.
История и развитие
До появления WidgetKit в iOS существовали виджеты в Центре уведомлений, основанные на более старом фреймворке Today Extension (iOS 8, 2014 год). Они были статичными, имели ограниченные возможности обновления и отображались только в выдвижной панели. WidgetKit стал эволюционным шагом, позволив размещать виджеты непосредственно на главном экране, что сделало их более заметными и функциональными.
На WWDC 2020 Apple представила WidgetKit как часть экосистемы SwiftUI, подчеркнув его интеграцию с новым механизмом обновления контента — Timeline Provider. В последующих версиях iOS (начиная с iOS 16) WidgetKit получил поддержку виджетов на экране блокировки, а также интерактивных элементов (например, кнопок для выполнения простых действий без открытия приложения). В macOS виджеты были интегрированы в Центр уведомлений и рабочий стол, а в watchOS — в циферблаты и умные стопки.
Архитектура и ключевые компоненты
WidgetKit построен на основе SwiftUI и Swift, что обеспечивает декларативный подход к созданию интерфейса. Основные компоненты фреймворка включают:
Виджет (Widget)
Виджет определяется как структура, соответствующая протоколу Widget. Она содержит конфигурацию, включающую имя, описание, поддерживаемые размеры (small, medium, large, extraLarge) и поставщика временной шкалы (Timeline Provider). Каждый виджет может иметь несколько вариантов отображения в зависимости от размера.
Поставщик временной шкалы (Timeline Provider)
Это центральный элемент, управляющий обновлением контента виджета. Поставщик реализует протокол TimelineProvider, который определяет три метода:
placeholder(in:)— возвращает статический макет-заполнитель, отображаемый во время загрузки.getSnapshot(in:completion:)— возвращает мгновенный снимок данных для предварительного просмотра (например, в галерее виджетов).getTimeline(in:completion:)— возвращает временную шкалу (Timeline), содержащую последовательность записей (TimelineEntry) с указанием времени их актуальности. Система использует эту шкалу для обновления виджета в фоновом режиме.
Запись временной шкалы (TimelineEntry)
Каждая запись содержит данные, которые должны быть отображены в виджете в определённый момент времени. Например, для виджета погоды запись может включать температуру, иконку и время следующего обновления.
Представление виджета (Widget View)
Интерфейс виджета строится с использованием SwiftUI. Разработчик описывает, как данные отображаются в зависимости от размера виджета. SwiftUI автоматически адаптирует контент под заданные размеры.
Конфигурация и настройки
Виджеты могут быть статическими (с фиксированным набором данных) или настраиваемыми (пользователь может изменять параметры, например, выбирать город для отображения погоды). Для настройки используется протокол IntentTimelineProvider, который интегрируется с SiriKit и позволяет пользователю задавать параметры через интерфейс системы.
Виды и размеры
WidgetKit поддерживает несколько стандартных размеров виджетов, которые зависят от платформы:
- iOS/iPadOS: small (2x2 ячейки), medium (4x2 ячейки), large (4x4 ячейки). Начиная с iOS 15, добавлен extraLarge (4x8 ячеек) для iPad.
- macOS: small, medium, large (аналогично iOS, но с адаптацией под разрешение экрана).
- watchOS: small, medium, large, а также круглые и прямоугольные варианты для циферблатов.
Пользователь может добавлять виджеты на главный экран, экран блокировки (iOS 16+) или в Центр уведомлений (macOS), а также группировать их в «умные стопки», которые автоматически переключают отображение в зависимости от времени суток или активности.
Принципы работы и обновления
WidgetKit использует энергоэффективные механизмы для обновления контента. В отличие от полноценных приложений, виджеты не выполняют код в фоновом режиме постоянно. Вместо этого:
- Система вызывает
getTimelineдля получения временной шкалы, которая определяет, когда виджет должен обновиться. - Обновления происходят в строго ограниченные моменты времени, указанные в записях шкалы (например, каждые 15 минут для погоды).
- Внеплановые обновления могут быть инициированы через
WidgetCenter(например, при получении push-уведомления или изменении данных в приложении). - Интерактивные элементы (кнопки, переключатели) обрабатываются через
App IntentsилиWidgetURL, позволяя выполнять простые действия (например, отметка задачи как выполненной) без открытия приложения.
Применение и примеры
WidgetKit широко используется разработчиками для интеграции виджетов в различные категории приложений:
- Погода: отображение текущей температуры, прогноза на день, осадков.
- Календарь и планировщики: показ ближайших событий, задач, напоминаний.
- Фитнес и здоровье: отображение шагов, пульса, калорий, активности.
- Новости и финансы: курсы валют, котировки акций, заголовки новостей.
- Системные утилиты: часы, дата, батарея, управление воспроизведением музыки.
- Игры: отображение статистики, достижений, времени до следующего хода.
Примеры популярных виджетов, созданных с помощью WidgetKit: «Погода» от Apple, «Календарь» от Fantastical, «Заметки» от Bear, «Трекер привычек» от Streaks.
Ограничения и критика
Несмотря на преимущества, WidgetKit имеет ряд ограничений:
- Ограниченная интерактивность: до iOS 17 виджеты были преимущественно информационными; интерактивные элементы (кнопки) появились только в iOS 17, но их функциональность остаётся ограниченной (например, нельзя запустить сложные процессы).
- Частота обновлений: система жёстко контролирует время обновления, что может приводить к задержкам в отображении актуальных данных (например, в чатах или социальных сетях).
- Зависимость от SwiftUI: виджеты не поддерживают UIKit, что ограничивает возможности для сложных кастомных интерфейсов.
- Ограничения на размер и сложность: виджеты не могут содержать прокручиваемые списки, видео или анимации высокой сложности.
- Проблемы с конфиденциальностью: виджеты могут отображать чувствительные данные (например, письма или сообщения) на экране блокировки, что требует от разработчиков реализации механизмов сокрытия информации (например, через
PrivacySensitive).
Критики также отмечают, что виджеты на iOS занимают фиксированное место на сетке главного экрана, что может быть неудобно для пользователей с большим количеством приложений. В macOS виджеты менее популярны из-за традиционного использования панели меню и Dock.
Сравнение с аналогами
На Android виджеты существуют с 2008 года и имеют более широкие возможности: они могут быть интерактивными, занимать произвольное пространство на экране, обновляться в реальном времени и включать сложные элементы (например, списки или карты). WidgetKit, напротив, более строго регламентирован, что обеспечивает единообразие интерфейса и энергоэффективность, но снижает гибкость. В экосистеме Windows виджеты (через Widgets Board) появились в Windows 11, но их функциональность пока уступает как iOS, так и Android.
Источники
- Apple Inc. «WidgetKit | Apple Developer Documentation». — developer.apple.com/documentation/widgetkit.
- Apple Inc. «WWDC 2020: Meet WidgetKit». — Видеозапись сессии WWDC 2020.
- Apple Inc. «Human Interface Guidelines: Widgets». — developer.apple.com/design/human-interface-guidelines/widgets.
- Статья «WidgetKit: A Complete Guide for iOS Developers» на сайте Hacking with Swift (Paul Hudson).
- Обзор возможностей WidgetKit в iOS 17 на портале 9to5Mac.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →