WidgetKit — het Apple-framework, geïntroduceerd in iOS 14, waarmee ontwikkelaars dynamische widgets kunnen plaatsen op het startscherm van iPhone en iPad, het Mac-bureaublad en de wijzerplaat van Apple Watch. Widgets tonen belangrijke informatie zonder de app te openen — weersverwachting, wisselkoersen, agenda, stappen. Volgens Apple Developer Documentation, 2026 verwerkt WidgetKit dagelijks tot 2 miljard widgetupdates in het Apple-ecosysteem, wat het een van de meest gebruikte frameworks maakt voor het weergeven van informatie op systeemschermen.
Belangrijkste
WidgetKit — het Apple-framework voor het maken van widgets die inhoud weergeven op de systeemschermen van Apple-apparaten. Een widget is een miniatuurweergave van uw app die de gebruiker op het startscherm plaatst in de schudmodus (jiggle mode). In tegenstelling tot watchOS-complicaties die vóór WidgetKit bestonden, heeft het nieuwe framework het maken van widgets voor alle Apple-platforms via een uniforme API op SwiftUI gestroomlijnd.
Het werkingsprincipe van WidgetKit is gebaseerd op TimelineProvider — een object dat een geordende array van TimelineEntry maakt, waarbij elke entry een Snapshot (specifieke widgetstatus op een bepaald moment) bevat. Het systeem toont de entries sequentieel en werkt de widget bij bij de overgang naar de volgende entry op de tijdlijn. Tussen entries door roept WidgetKit geen app-code aan — processortijd wordt alleen verbruikt bij het maken van een nieuwe Timeline.
Volgens gegevens van WWDC 2024 Session „WidgetKit: What’s new” heeft de gemiddelde iOS-gebruiker 8–12 widgets op het startscherm, en de populairste categorieën zijn weer, tijd, agenda, fitness en financiën. WidgetKit verbruikt minder dan 1% batterij per dag bij normaal gebruik, omdat updates volgens een schema plaatsvinden, niet in realtime.
Vóór iOS 14 bestonden widgets alleen als Today View — een paneel dat toegankelijk was door naar links te vegen vanaf het eerste scherm. Today Extensions hadden ernstige beperkingen: ze waren alleen beschikbaar op het „Vandaag”-scherm, vereisten het openen van de app voor het bijwerken van de inhoud en hadden beperkte ondersteuning voor formaten. WidgetKit heeft Today Extensions volledig vervangen door widgets aan te bieden op het startscherm, het vergrendelscherm (iOS 16+) en het Mac-bureaublad.
De architectuur van WidgetKit is gebaseerd op drie belangrijke protocollen: TimelineProvider, TimelineEntry en Widget. TimelineEntry is een gegevensmodel dat de status van de widget op een specifiek moment vertegenwoordigt. TimelineProvider maakt een array van dergelijke entries (Timeline) met een activatiedatum voor elke entry. Widget — het toegangspunt dat de provider verbindt met de SwiftUI-weergave.
De methode getTimeline wordt door het systeem aangeroepen bij de eerste toevoeging van de widget en vervolgens periodiek — meestal elke 1–6 uur, afhankelijk van het providertype. Een Timeline kan entries voor uren of dagen vooruit bevatten, waardoor de widget kan werken zonder app-code aan te roepen tussen updates. Als de widget dringend moet worden bijgewerkt (bijvoorbeeld bij een gewijzigde wisselkoers), kan de app WidgetCenter.shared.reloadAllTimelines() geforceerd aanroepen.
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 ondersteunt drie widgetformaten, elk met vaste verhoudingen. Small (170×170 pt op iPhone) toont compacte informatie — een enkele waarde, pictogram of korte tekst. Medium (364×170 pt) is tweemaal zo breed als small en geschikt voor het tonen van enkele waarden of een minigrafiek. Large (364×382 pt) beslaat bijna de helft van het scherm verticaal en maakt het mogelijk tabellen, lijsten of uitgebreide gegevens weer te geven.
De ontwikkelaar moet ten minste twee formaten ondersteunen — Apple adviseert small + medium. Large-widget is alleen nodig als de app voldoende inhoud heeft om een dergelijk volume te vullen. Elk formaat krijgt zijn eigen SwiftUI-weergave die WidgetKit op het systeemscherm rendert. Het is belangrijk dat WidgetKit geen aangepaste formaten ondersteunt — alleen drie vaste, wat de uniformiteit van de interface garandeert.
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 biedt twee configuratietypen — StaticConfiguration en IntentConfiguration. StaticConfiguration is geschikt voor widgets die dezelfde inhoud voor alle gebruikers tonen: wisselkoersen, weer, agenda. IntentConfiguration stelt de gebruiker in staat de widget aan te passen bij het toevoegen via het Siri-intentsysteem — bijvoorbeeld een specifieke stad selecteren voor het weer of een specifieke ticker voor de aandelenkoers.
IntentConfiguration gebruikt INWidgetIntent — een subklasse van INIntent uit SiriKit. Wanneer de gebruiker een widget toevoegt en parameters selecteert (bijvoorbeeld stad), slaat het systeem deze intent op en geeft deze bij elke update door aan TimelineProvider. De provider ontvangt de intent in de getTimeline-methode en gebruikt de parameters om inhoud te genereren. IntentConfiguration is de voorkeursmethode voor gepersonaliseerde widgets omdat het integreert met Siri en 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)
}
}
}
Het maken van een widget begint met het toevoegen van Widget Extension Target in Xcode: File → New → Target → Widget Extension. Xcode genereert automatisch een structuur met TimelineEntry, TimelineProvider en WidgetConfiguration. De ontwikkelaar hoeft alleen de SwiftUI-weergave voor het tonen van gegevens te implementeren en de provider te configureren voor een correct updateschema.
Hieronder — een volledig voorbeeld van een eenvoudige widget voor het weergeven van de huidige bitcoinprijs: Provider laadt de prijs via URLSession en maakt een Timeline met een update elk uur. WidgetSwiftUIView toont de prijs in een groot lettertype en de tijd van de laatste update in een klein lettertype.
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 ? "+" : "")
}
}
}
Vanaf iOS 16 heeft WidgetKit de ondersteuning uitgebreid naar Lock Screen — het vergrendelscherm van de iPhone. Lock Screen-widgets zijn er in twee typen: inline (een enkele tekstregel onder de klok) en rectangular (een rechthoekig gebied). In tegenstelling tot Home Screen-widgets worden Lock Screen-widgets vaker bijgewerkt — de systeemtrigger maakt updates elke 15–30 minuten mogelijk om actuele informatie te tonen zonder de telefoon te ontgrendelen.
Lock Screen-widgets vereisen een aparte configuratie via WidgetConfiguration met accessoryFamilies: accessoryCircular, accessoryRectangular, accessoryInline. Deze families hebben strikte beperkingen qua grootte en inhoud — ze ondersteunen geen afbeeldingen, animaties en aangepaste lettertypen. Apple raadt aan alleen tekstuele informatie en systeempictogrammen SF Symbols te gebruiken voor Lock Screen-widgets.
Bij het ontwikkelen van widgets is het belangrijk rekening te houden met de beperkingen van WidgetKit. Widgets zijn alleen-lezen weergaven: ze verwerken geen aanraakgebeurtenissen (behalve tikken die de app opent). Widgets ondersteunen geen animatie, video, toetsenbordinvoer, scrollen of interactieve elementen. Elke widget is een statische momentopname van gegevens op een bepaald moment, en een poging om interactiviteit toe te voegen leidt tot afwijzing van de app in de App Store.
Best practices omvatten Widget Center voor geforceerde updates, het cachen van gegevens op TimelineProvider-niveau voor snelle respons en het gebruik van placeholders voor de beginstatus. Ook belangrijk is het ondersteunen van meerdere formaten — de gebruiker verwacht dat de widget beschikbaar is in zowel small als medium variant. Vermijd het tonen van onnauwkeurige of verouderde gegevens — de gebruiker onthoudt onjuiste informatie van de widget lang.
| Wat niet kan | Waarom |
|---|---|
| Animatie en video | Widgets zijn statische momentopnames; animatie verbruikt batterij |
| Interactiviteit | WidgetKit ondersteunt geen UI-elementen behalve link naar app |
| Scrollen | Vast formaat zonder scrollen |
| Toetsenbord | Tekstinvoer in widget is onmogelijk |
| Live gegevens | Gegevens worden bijgewerkt volgens Timeline-schema, niet in realtime |
| Aangepaste formaten | Alleen small, medium, large, accessory* vast |
Veelgestelde vragen
Ja, WidgetKit is cross-platform. Dezelfde Widget Extension kan worden opgenomen in iOS-, iPadOS- en macOS-targets met uniforme SwiftUI-code. Verschillen tonen zich alleen in ondersteunde Family — op Mac is er geen accessoryRectangular.
Volgens het Timeline-schema. De ontwikkelaar bepaalt wanneer de volgende update plaatsvindt — over een minuut of over een dag. Het systeem kan updates versnellen voor veelgebruikte widgets.
Nee, WidgetKit ondersteunt geen UIButton of interactieve elementen. De enige actie is tikken op de widget, die de app opent via een deep link.
Gebruik WidgetCenter.shared.reloadAllTimelines() of reloadTimelines(ofKind:) voor een specifieke widget. De aanroep vanuit de app vraagt onmiddellijk een nieuwe Timeline aan bij de provider.
Minimaal — minder dan 1% lading per dag bij normaal gebruik. WidgetKit beperkt achtergrondupdates en houdt de app niet actief. De grootste kostenpost is het maken van Timeline bij de eerste toevoeging.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook