Today Widget е разширение за iOS, което показва интерактивна информация директно в Центъра за известия или на екрана „Днес”. Потребителят вижда актуални данни — време, валутен курс, календар — без да отваря основното приложение. Според данни на Apple WWDC (2025), използването на WidgetKit е нараснало с 40% след въвеждането на интерактивни widget-и в iOS 17. Today Widget решава проблема с бързия достъп до информация: поглед към екрана — и потребителят получава необходимите данни без навигация в приложението.
Основни точки
Today Widget (известен още като widget на Центъра за известия) — елемент от интерфейса на iOS, който показва сбита информация от приложението, без да го стартира. Потребителят вижда widget-а, като плъзга екрана наляво на заключения екран или на началния екран. Widget-ът може да показва динамични данни — валутен курс, последни новини, статус на задачи, състояние на устройството.
Исторически, Today Widget се появи в iOS 8 като разширение на Центъра за известия, имплементирано чрез рамката Notification Center. С iOS 14 Apple представи WidgetKit — напълно преработена архитектура, която позволява поставяне на widget-и директно на работния плот. Today Widget в съвременния смисъл — WidgetKit widget, поставен в секцията „Днес” (секцията за widget-и вляво от първия екран).
Основната цел е намаляване на времето за достъп до информация. Вместо да отваря приложението, да навигира в менюто и да чака зареждане, потребителят веднага вижда необходимите данни. Според Apple (2024), приложенията с widget-и показват 27% по-висока ангажираност на потребителите. Допълнителни сценарии: бързи действия (отбелязване на задача като завършена), мониторинг (пулс, активност) и състояние (зареждане на батерията, известия).
Разработчикът на Today Widget има два подхода: модерен WidgetKit (iOS 14+) и legacy разширението NCWidgetProviding (iOS 8–13). Изборът зависи от минималната поддържана версия на iOS. WidgetKit се препоръчва за нови проекти, NCWidgetProviding — за поддръжка на стари устройства.
| Характеристика | WidgetKit | NCWidgetProviding |
|---|---|---|
| Минимално iOS | iOS 14 | iOS 8 |
| Разположение | Работен плот + „Днес” | Само „Днес” |
| Размери | Small, Medium, Large | Един фиксиран |
| Интерактивност | iOS 17+ бутони и превключватели | Само отваряне на приложението |
| Обновяване | Timeline Provider | widgetPerformUpdate |
| Език | SwiftUI | UIKit |
Ако вашето приложение поддържа iOS 14 и по-нови — използвайте WidgetKit. Той предлага богати възможности: множество размери, конфигурация чрез intent, преработен дизайн с iOS 17 и задълбочени връзки. Декларативността на SwiftUI прави кода на widget-а компактен и четим. Timeline Provider автоматично управлява графика за обновяване, като взема предвид консумацията на енергия.
Само ако се изисква поддръжка за iOS 9–13. NCWidgetProviding е по-лесен за имплементиране — това е обикновен UIViewController с протокол. Той обаче е ограничен: един размер, само UIKit, без конфигурация. Apple препоръчва преминаване към WidgetKit дори за стари проекти, използвайки availability check: WidgetKit на iOS 14+, NCWidgetProviding като fallback.
В съвременния iOS се различават три вида widget-и според функционалното предназначение. Всеки вид решава своя задача и изисква различен подход към проектирането на данни и интерфейс. Класификацията помага да изберете правилната архитектура за вашето приложение.
Показват статична или периодично обновявана информация: време, дата, валутен курс, статус на сървъра. Данните се обновяват по график чрез Timeline Provider. Потребителят не взаимодейства с widget-а — само чете. Информационните widget-и са най-лесни за имплементиране, не изискват обработка на докосвания и работят на заден план без допълнителни разрешения.
От iOS 17 WidgetKit поддържа бутони, превключватели и плъзгачи в widget-ите. Потребителят може да извърши действие — да отбележи задача, да постави музика на пауза, да включи светлина — без да отваря приложението. Interactive Widgets използват App Intents за предаване на действието към основното приложение. Ограничение: само на работния плот, не в секцията „Днес” до iOS 18.
Потребителят персонализира показваните данни чрез системния интерфейс — избира град за времето, сметка за финансите, категория за новините. Имплементира се чрез Intents Extension и конфигурация в WidgetBundle. Конфигурируемите widget-и повишават персонализацията и релевантността на информацията за всеки потребител.
Нека разгледаме процеса на създаване на Today Widget в SwiftUI с помощта на WidgetKit. Widget-ът ще показва текущия валутен курс с автоматично обновяване. WidgetKit изисква три компонента: структура на widget-а, 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 гарантира, че widget-ът показва актуални данни без постоянно запитване към сървъра.
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 — централният механизъм на WidgetKit за управление на данни на Today Widget. Вместо периодично обновяване с таймер (както в стария NCWidgetProviding), WidgetKit използва концепцията за timeline — последователност от записи с времеви маркери. Системата показва текущия запис до неговото изтичане, след което превключва към следващия или изисква нов.
Timeline поддържа три политики: .after(date) — следващо обновяване на определена дата; .never — widget-ът не се обновява до изрично извикване на WidgetCenter.reloadAllTimelines; .atEnd — обновяване след показване на последния запис. За Today Widget с валутен курс, политиката .after с интервал от 15–30 минути е оптимална. Енергийна ефективност — ключово предимство на WidgetKit: системата групира обновяванията на всички widget-и в един прозорец.
Ако данните се променят преди изтичането на timeline (напр. потребителят е обновил валутния курс в приложението), извикайте WidgetCenter.shared.reloadTimelines(ofKind: "CurrencyWidget"). Това ще изиска нов timeline от Provider-а и ще обнови показването. WidgetCenter също така позволява презареждане на всички widget-и на приложението с една команда — удобно след синхронизиране на данни.
Apple поставя строги изисквания към дизайна на Today Widget: съдържанието трябва да бъде четливо от разстояние, без излишни елементи и с ясна йерархия. Нарушаването на препоръките на HIG (Human Interface Guidelines) е причина за отказ при публикуване в App Store. Три принципа: glanceability, consistency и hierarchy.
Потребителят прекарва по-малко от секунда на widget-а. Не добавяйте повече от 3–4 елемента данни. Шрифт — минимум 11pt за етикети, 17pt за стойности. Използвайте удебелен шрифт (Semibold) за ключови числа. Избягвайте превъртане — Today Widget не се превърта.
WidgetKit поддържа три размера: Small (170×170pt), Medium (364×170pt), Large (364×382pt). За Today Widget в секцията „Днес” Medium е най-честият избор. Адаптивен дизайн чрез EnvironmentValues: променяйте плътността на информацията в зависимост от размера. Small — едно число, Medium — число + графика, Large — таблица.
Widget-ът трябва да се показва правилно в светла и тъмна тема без допълнителни действия от разработчика — WidgetKit автоматично поема системните цветове. Dynamic Type за widget-и е ограничен: размерът на шрифта е фиксиран, но трябва да бъде четлив. UIColor.label и UIColor.systemBackground — основни цветове за текст и фон в двете теми.
Често задавани въпроси
Днес това е един и същ WidgetKit widget. Разликата е само в местоположението: на работния плот и в секцията „Днес” (вляво от първия екран). До iOS 14 Today Widget беше отделно разширение NCWidgetProviding, което работеше само в Центъра за известия. Сега това е единен WidgetKit.
WidgetKit не обновява widget-и с таймер. Разработчикът задава график чрез Timeline Provider: записи с времеви маркери. Системата гарантира обновяване в определеното време, като взема предвид пестенето на енергия — може да забави с няколко минути. Минимален интервал — 15 минути, но Apple препоръчва не по-често от 1 път на час.
Да, от iOS 17 WidgetKit поддържа бутони, превключватели и плъзгачи чрез App Intents. Интерактивните елементи работят на работния плот на iPhone и iPad. В секцията „Днес” поддръжката се появи в iOS 18. За iOS 16 и по-стари — само отваряне на приложението при докосване на widget-а.
Няма ограничения. Приложението може да регистрира произволен брой widget-и чрез WidgetBundle — всеки със собствен тип, размер и конфигурация. Потребителят ги добавя поотделно. Препоръчва се не повече от 3–5 widget-а, за да не се претоварва изборът на потребителя.
WidgetKit се поддържа напълно в iOS Simulator. Стартирайте WidgetKit target схемата в Xcode — widget-ът ще се появи на работния плот на симулатора. За проверка на Timeline Provider използвайте WidgetKit Debug Profile: Xcode → Product → Profile → WidgetKit Debug. Проверете реалното поведение на физическо устройство.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също