WidgetKit — фреймуъркът на Apple, представен в iOS 14, който позволява на разработчиците да поставят динамични уиджети на началния екран на iPhone и iPad, работния плот на Mac и циферблата на Apple Watch. Уиджетите показват ключова информация без отваряне на приложението — прогноза за времето, валутни курсове, календар, стъпки. Според Apple Developer Documentation, 2026, WidgetKit обработва до 2 милиарда актуализации на уиджети дневно в екосистемата на Apple, което го прави един от най-използваните фреймуърци за показване на информация на системни екрани.
Основни
WidgetKit — фреймуъркът на Apple за създаване на уиджети, които показват съдържание на системните екрани на устройствата на Apple. Уиджетът е миниатюрно представяне на вашето приложение, което потребителят поставя на началния екран в режим на разклащане (jiggle mode). За разлика от watchOS компликациите, които съществуваха преди WidgetKit, новият фреймуърк обедини създаването на уиджети за всички платформи на Apple чрез единен API на SwiftUI.
Принципът на работа на WidgetKit се основава на TimelineProvider — обект, който създава подреден масив от TimelineEntry, където всеки запис съдържа Snapshot (конкретно състояние на уиджета в определен момент от време). Системата показва записите последователно, актуализирайки уиджета при преминаване към следващия запис на времевата линия. Между записите WidgetKit не извиква кода на приложението — процесорно време се изразходва само при създаване на нов Timeline.
Според данни от WWDC 2024 Session „WidgetKit: What’s new”, средният потребител на iOS има 8–12 уиджета на началния екран, а най-популярните категории са време, час, календар, фитнес и финанси. WidgetKit консумира по-малко от 1% от батерията на ден при типична употреба, благодарение на това че актуализациите се извършват по график, а не в реално време.
Преди iOS 14 уиджетите съществуваха само като Today View — панел, достъпен чрез плъзгане наляво от първия екран. Today Extension имаха сериозни ограничения: бяха достъпни само на екрана „Днес”, изискваха отваряне на приложението за актуализиране на съдържанието и имаха ограничена поддръжка на размери. WidgetKit напълно замени Today Extension, предоставяйки уиджети на началния екран, заключения екран (iOS 16+) и работния плот на Mac.
Архитектурата на WidgetKit се основава на три ключови протокола: TimelineProvider, TimelineEntry и Widget. TimelineEntry е модел на данни, представляващ състоянието на уиджета в определен момент от време. TimelineProvider създава масив от такива записи (Timeline), като посочва дата на активиране за всеки. Widget — входната точка, която свързва доставчика с изгледа SwiftUI.
Методът getTimeline се извиква от системата при първото добавяне на уиджета и след това периодично — обикновено на всеки 1–6 часа в зависимост от типа на доставчика. Timeline може да съдържа записи за часове или дни напред, което позволява на уиджета да работи без извикване на кода на приложението между актуализациите. Ако е необходимо спешно актуализиране на уиджета (напр. промени се валутният курс), приложението може принудително да извика WidgetCenter.shared.reloadAllTimelines().
struct SimpleEntry: TimelineEntry {
let date: Date
let value: Double
}
struct Provider: TimelineProvider {
typealias Entry = SimpleEntry
func placeholder(in context: Context) -> Entry {
Entry(date: Date(), value: 0)
}
func getSnapshot(
in context: Context,
completion: @escaping (Entry) -> Void
) {
Entry(date: Date(), value: 42.5)
}
func getTimeline(
in context: Context,
completion: @escaping (Timeline<Entry>, Error?) -> Void
) {
let entry = Entry(date: Date(), value: fetchLatestValue())
let nextUpdate = Calendar.current
.date(byAdding: .hour, value: 1, to: Date())!
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline, nil)
}
}
WidgetKit поддържа три размера уиджети, всеки с фиксирани пропорции. Small (170×170 pt на iPhone) показва компактна информация — една стойност, икона или кратък текст. Medium (364×170 pt) е два пъти по-широк от small и е подходящ за показване на няколко стойности или мини-графика. Large (364×382 pt) заема почти половината от екрана вертикално и позволява показване на таблици, списъци или разширени данни.
Разработчикът трябва да поддържа поне два размера — Apple препоръчва small + medium. Large уиджет е необходим само ако приложението има достатъчно съдържание за запълване на такъв обем. Всеки размер получава собствен SwiftUI изглед, който WidgetKit рендира на системния екран. Важно е, че WidgetKit не поддържа персонализирани размери — само три фиксирани, което гарантира еднородност на интерфейса.
struct WeatherWidget: Widget {
let kind: String = "WeatherWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
WeatherWidgetView(entry: entry)
}
.configurationDisplayName("Weather")
.description("Current temperature and forecast")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
WidgetKit предлага два типа конфигурация — StaticConfiguration и IntentConfiguration. StaticConfiguration е подходящ за уиджети, които показват едно и също съдържание за всички потребители: валутни курсове, време, календар. IntentConfiguration позволява на потребителя да персонализира уиджета при добавяне чрез системата за интенти на Siri — например да избере конкретен град за времето или конкретен тикер за цената на акция.
IntentConfiguration използва INWidgetIntent — подклас на INIntent от SiriKit. Когато потребителят добави уиджет и избере параметри (напр. град), системата запазва този интент и го предава на TimelineProvider при всяка актуализация. Доставчикът получава интента в метода getTimeline и използва неговите параметри за генериране на съдържание. IntentConfiguration е предпочитаният метод за персонализирани уиджети, тъй като се интегрира със Siri и Shortcuts.
struct WeatherWidgetEntryView: View {
var entry: WeatherEntry
var body: some View {
VStack(alignment: .leading) {
Text(entry.cityName)
.font(.caption)
.foregroundColor(.secondary)
Text("\(entry.temperature)°C")
.font(.largeTitle)
}
}
}
struct WeatherWidget: Widget {
var body: some WidgetConfiguration {
IntentConfiguration(
kind: "WeatherWidget",
intent: WeatherConfigIntent.self,
provider: WeatherTimelineProvider()
) { entry in
WeatherWidgetEntryView(entry: entry)
}
}
}
Създаването на уиджет започва с добавяне на Widget Extension Target в Xcode: File → New → Target → Widget Extension. Xcode автоматично генерира структура с TimelineEntry, TimelineProvider и WidgetConfiguration. На разработчика остава само да имплементира SwiftUI изгледа за показване на данни и да конфигурира доставчика за правилен график на актуализации.
По-долу — пълен пример на прост уиджет за показване на текущата цена на биткойн: Provider зарежда цената чрез URLSession и създава Timeline с актуализация на всеки час. WidgetSwiftUIView показва цената с голям шрифт и времето на последната актуализация с малък шрифт.
struct BTCPriceEntry: TimelineEntry {
let date: Date
let price: Double
let change24h: Double
}
struct BTCWidgetEntryView: View {
var entry: BTCPriceEntry
var body: some View {
VStack {
Text("BTC/USD").font(.caption)
Text("$\(entry.price, specifier: "%.0f")")
.font(.title2).fontWeight(.bold)
Text(entry.change24h > 0 ? "+" : "")
}
}
}
От iOS 16 WidgetKit разшири поддръжката до Lock Screen — заключения екран на iPhone. Уиджетите на Lock Screen са два типа: inline (един ред текст под часовника) и rectangular (правоъгълна област). За разлика от Home Screen уиджетите, Lock Screen уиджетите се актуализират по-често — системният тригер позволява актуализиране на всеки 15–30 минути за показване на актуална информация без отключване на телефона.
Lock Screen уиджетите изискват отделна конфигурация чрез WidgetConfiguration с accessoryFamilies: accessoryCircular, accessoryRectangular, accessoryInline. Тези семейства имат строги ограничения за размер и съдържание — не поддържат изображения, анимация и персонализирани шрифтове. Apple препоръчва използването само на текстова информация и системни икони SF Symbols за Lock Screen уиджети.
При разработката на уиджети е важно да се вземат предвид ограниченията на WidgetKit. Уиджетите са изгледи само за четене: не обработват събития на докосване (освен докосване, което отваря приложението). Уиджетите не поддържат анимация, видео, въвеждане от клавиатура, скролиране или интерактивни елементи. Всеки уиджет е статичен моментен снимка на данни в определен момент от време и опитът за добавяне на интерактивност ще доведе до отхвърляне на приложението в App Store.
Най-добрите практики включват Widget Center за принудителна актуализация, кеширане на данни на ниво TimelineProvider за бърза реакция и използване на placeholder за начално състояние. Също така е важно да поддържате няколко размера — потребителят очаква уиджетът да бъде достъпен както в small, така и в medium вариант. Строго избягвайте показването на неточни или остарели данни — потребителят запомня грешна информация от уиджета за дълго време.
| Какво не е позволено | Защо |
|---|---|
| Анимация и видео | Уиджетите са статични моментни снимки; анимацията изтощава батерията |
| Интерактивност | WidgetKit не поддържа UI елементи освен връзка към приложението |
| Скролиране | Фиксиран размер без скролиране |
| Клавиатура | Въвеждане на текст в уиджета е невъзможно |
| Живи данни | Данните се актуализират по график на Timeline, не в реално време |
| Персонализирани размери | Само small, medium, large, accessory* фиксирани |
Често задавани въпроси
Да, WidgetKit е междуплатформен. Същата Widget Extension може да бъде включена в iOS, iPadOS и macOS цели с единен SwiftUI код. Разликите се проявяват само в поддържаните Family — на Mac няма accessoryRectangular.
По график на Timeline. Разработчикът определя кога ще бъде следващата актуализация — след минута или след ден. Системата може също да ускорява актуализациите за често използвани уиджети.
Не, WidgetKit не поддържа UIButton или каквито и да е интерактивни елементи. Единственото действие е докосване на уиджета, което отваря приложението чрез deep link.
Използвайте WidgetCenter.shared.reloadAllTimelines() или reloadTimelines(ofKind:) за конкретен уиджет. Извикването от приложението незабавно изисква нов Timeline от доставчика.
Минимално — по-малко от 1% заряд на ден при типична употреба. WidgetKit ограничава фоновите актуализации и не държи приложението активно. Основният разход е създаването на Timeline при първото добавяне.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също