WidgetKit est un framework Apple présenté dans iOS 14 qui permet aux développeurs de placer des widgets dynamiques sur l'écran d'accueil de l'iPhone et de l'iPad, le bureau du Mac et le cadran de l'Apple Watch. Les widgets affichent les informations clés sans ouvrir l'application — prévisions météo, taux de change, calendrier, pas. Selon Apple Developer Documentation, 2026, WidgetKit traite jusqu'à 2 milliards de mises à jour de widgets par jour dans l'écosystème Apple, ce qui en fait l'un des frameworks les plus utilisés pour afficher des informations sur les écrans système.
Points clés
WidgetKit est un framework Apple pour créer des widgets qui affichent du contenu sur les écrans système des appareils Apple. Un widget est une représentation miniature de votre application que l'utilisateur place sur l'écran d'accueil en mode jiggle. Contrairement aux complications watchOS qui existaient avant WidgetKit, le nouveau framework a unifié la création de widgets pour toutes les plateformes Apple via une API unique basée sur SwiftUI.
Le principe de fonctionnement de WidgetKit est basé sur TimelineProvider — un objet qui crée un tableau ordonné de TimelineEntry, où chaque entrée contient un Snapshot (un état spécifique du widget à un moment donné). Le système affiche les entrées séquentiellement, mettant à jour le widget lors du passage à l'entrée suivante sur la timeline. Entre les entrées, WidgetKit n'appelle pas le code de l'application — le temps CPU est consommé uniquement lors de la création d'une nouvelle Timeline.
Selon la session WWDC 2024 « WidgetKit : What’s new », l'utilisateur iOS moyen a 8–12 widgets sur son écran d'accueil, les catégories les plus populaires étant la météo, l'heure, le calendrier, le fitness et la finance. WidgetKit consomme moins de 1% de charge de batterie par jour en utilisation typique grâce à des mises à jour planifiées plutôt qu'en temps réel.
Avant iOS 14, les widgets existaient uniquement sous forme de Today View — un panneau accessible en balayant vers la gauche depuis le premier écran. Les Today Extensions avaient des limitations sérieuses : elles n'étaient disponibles que sur l'écran « Aujourd'hui », nécessitaient d'ouvrir l'application pour mettre à jour le contenu et avaient un support de tailles limité. WidgetKit a complètement remplacé les Today Extensions, offrant des widgets sur l'écran d'accueil, l'écran de verrouillage (iOS 16+) et le bureau du Mac.
L'architecture de WidgetKit repose sur trois protocoles clés : TimelineProvider, TimelineEntry et Widget. TimelineEntry est un modèle de données représentant l'état du widget à un moment spécifique. TimelineProvider crée un tableau de ces entrées (Timeline), en spécifiant la date d'activation pour chacune. Widget est le point d'entrée qui connecte le fournisseur à la vue SwiftUI.
La méthode Timeline getTimeline est appelée par le système lors du premier ajout du widget, puis périodiquement — généralement toutes les 1–6 heures selon le type de fournisseur. Une Timeline peut contenir des entrées pour des heures ou des jours à l'avance, permettant au widget de fonctionner sans appeler le code de l'application entre les mises à jour. Si une mise à jour urgente est nécessaire (par exemple, changement de taux de change), l'application peut appeler WidgetCenter.shared.reloadAllTimelines() de manière forcée.
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 prend en charge trois tailles de widgets, chacune avec des proportions fixes. Small (170×170 pt sur iPhone) affiche des informations compactes — une valeur unique, une icône ou un texte court. Medium (364×170 pt) est deux fois plus large que small et convient pour afficher des paires de valeurs ou des mini-graphiques. Large (364×382 pt) occupe près de la moitié de l'écran verticalement et permet d'afficher des tableaux, des listes ou des données développées.
Le développeur doit prendre en charge au moins deux tailles — Apple recommande small + medium. Le widget Large n'est nécessaire que si l'application a suffisamment de contenu pour remplir ce volume. Chaque taille obtient sa propre vue SwiftUI, que WidgetKit rend sur l'écran système. Il est important que WidgetKit ne prend pas en charge les tailles personnalisées — seulement trois tailles fixes, garantissant l'uniformité de l'interface.
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 propose deux types de configuration — StaticConfiguration et IntentConfiguration. StaticConfiguration convient aux widgets qui affichent le même contenu pour tous les utilisateurs : taux de change, météo, calendrier. IntentConfiguration permet à l'utilisateur de personnaliser le widget lors de son ajout via le système d'intents Siri — par exemple, sélectionner une ville spécifique pour la météo ou un ticker spécifique pour le cours des actions.
IntentConfiguration utilise INWidgetIntent — une sous-classe d'INIntent de SiriKit. Lorsque l'utilisateur ajoute un widget et sélectionne des paramètres (ex. : ville), le système sauvegarde cet intent et le transmet à TimelineProvider à chaque mise à jour. Le fournisseur reçoit l'intent dans la méthode getTimeline et utilise ses paramètres pour former le contenu. IntentConfiguration est l'approche préférée pour les widgets personnalisés car il s'intègre avec Siri et 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)
}
}
}
La création d'un widget commence par l'ajout d'un Widget Extension Target dans Xcode : File → New → Target → Widget Extension. Xcode génère automatiquement une structure avec TimelineEntry, TimelineProvider et WidgetConfiguration. Le développeur n'a plus qu'à implémenter la vue SwiftUI pour afficher les données et configurer le fournisseur pour un calendrier de mise à jour correct.
Voici un exemple complet d'un widget simple pour afficher le prix actuel du Bitcoin : Provider charge le taux via URLSession et crée une Timeline avec des mises à jour toutes les heures. WidgetSwiftUIView affiche le taux en grande police et l'heure de la dernière mise à jour en petite police.
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 ? "+" : "")
}
}
}
Avec iOS 16, WidgetKit a étendu la prise en charge à l'écran de verrouillage — l'écran de verrouillage de l'iPhone. Les widgets d'écran de verrouillage sont de deux types : inline (une seule ligne de texte sous l'horloge) et rectangular (une zone rectangulaire). Contrairement aux widgets de l'écran d'accueil, les widgets d'écran de verrouillage sont mis à jour plus fréquemment — le déclencheur système permet des mises à jour toutes les 15–30 minutes pour afficher des informations actuelles sans déverrouiller le téléphone.
Les widgets d'écran de verrouillage nécessitent une configuration séparée via WidgetConfiguration avec accessoryFamilies : accessoryCircular, accessoryRectangular, accessoryInline. Ces familles ont des limitations strictes de taille et de contenu — elles ne supportent pas les images, les animations ou les polices personnalisées. Apple recommande d'utiliser uniquement des informations textuelles et les icônes système SF Symbols pour les widgets d'écran de verrouillage.
Lors du développement de widgets, il est important de prendre en compte les limitations de WidgetKit. Les widgets sont des vues en lecture seule : ils ne gèrent pas les événements tactiles (sauf un tap qui ouvre l'application). Les widgets ne supportent pas l'animation, la vidéo, la saisie au clavier, le défilement ou les éléments interactifs. Chaque widget est un instantané statique de données à un moment donné, et tenter d'ajouter de l'interactivité entraînera le rejet de l'application sur l'App Store.
Les bonnes pratiques incluent l'utilisation de Widget Center pour les mises à jour forcées, la mise en cache des données au niveau de TimelineProvider pour une réponse rapide et l'utilisation de placeholders pour l'état initial. Il est également important de prendre en charge plusieurs tailles — les utilisateurs s'attendent à ce que le widget soit disponible à la fois en variante small et medium. Évitez rigoureusement d'afficher des données inexactes ou obsolètes — les utilisateurs se souviennent longtemps des informations incorrectes provenant des widgets.
| Ce qui n'est pas autorisé | Pourquoi |
|---|---|
| Animation et vidéo | Les widgets sont des instantanés statiques ; l'animation épuise la batterie |
| Interactivité | WidgetKit ne supporte pas les éléments d'interface sauf les liens d'application |
| Défilement | Taille fixe sans défilement |
| Clavier | La saisie de texte dans les widgets est impossible |
| Données en direct | Les données sont mises à jour selon le calendrier Timeline, pas en temps réel |
| Tailles personnalisées | Uniquement les tailles fixes small, medium, large, accessory* |
Foire aux questions
Oui, WidgetKit est multiplateforme. La même Widget Extension peut être incluse dans les cibles iOS, iPadOS et macOS avec un seul code SwiftUI. Les différences n'apparaissent que dans les familles supportées — Mac n'a pas accessoryRectangular.
Selon le calendrier Timeline. Le développeur détermine quand la prochaine mise à jour aura lieu — dans une minute ou dans un jour. Le système peut également accélérer les mises à jour pour les widgets fréquemment utilisés.
Non, WidgetKit ne supporte pas UIButton ni aucun élément interactif. La seule action est un tap sur le widget, qui ouvre l'application via un deep link.
Utilisez WidgetCenter.shared.reloadAllTimelines() ou reloadTimelines(ofKind:) pour un widget spécifique. L'appel depuis l'application demande immédiatement une nouvelle Timeline au fournisseur.
Minimalement — moins de 1% de charge par jour en utilisation typique. WidgetKit limite les mises à jour en arrière-plan et ne maintient pas l'application active. La consommation principale est la création de la Timeline lors du premier ajout.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi