iOS-Widget-Development-Kit
Vues et aides SwiftUI pour les widgets WidgetKit, graphiques, timelines, App Intents et Live Activities
Licence: MIT
WidgetDevelopmentKit est un package Swift pour les développeurs qui créent des widgets pour leurs apps iOS. Il contient des vues SwiftUI prêtes à l'emploi pour les widgets Écran d'accueil, Écran verrouillé et StandBy, des vues de graphiques dimensionnées pour les widgets, des aides pour les timelines et pour les données que l'app partage avec son widget, des App Intents pour les boutons de widget, et des attributs et vues ActivityKit pour les Live Activities. Vous écrivez toujours l'extension de widget ; le package vous évite les vues et la logique de date, de stockage et de nouvelle tentative dont chaque widget a besoin. Il n'a aucune dépendance tierce.
Fonctionnalités
- Modèles Écran d'accueil comme météo, statistiques, finance, calendrier, compte à rebours, horloge, anneaux fitness, suivi d'habitudes, à faire et eau, plus 9 vues Swift Charts dimensionnées pour les widgets
- 15 vues d'accessoire Écran verrouillé (circular, rectangular, inline) et 7 vues StandBy
- Aides de timeline : dates d'entrée, politiques de rechargement utilisant l'arithmétique calendaire, et un magasin de snapshots avec expiration pour les données partagées via un App Group
- Widgets interactifs : 5 App Intents et 8 vues avec des boutons qui les exécutent
- Live Activities : 10 types ActivityAttributes avec des vues Écran verrouillé et Dynamic Island compactes, et une machine à états qui rejette les mises à jour désordonnées
- Un chargeur de données qui ne retente que les erreurs transitoires (408, 5xx, délais, hors ligne) et échoue rapidement à l'intérieur de l'extension de widget
- Logique de date, de nombre et de nouvelle tentative couverte par des tests Swift Testing, y compris NaN, les objectifs à zéro et les jours de changement d'heure ; un test garde les blocs de code du README synchronisés avec le code compilé
Démarrage rapide
1struct LaunchEntry: TimelineEntry {2 let date: Date3}4 5struct LaunchProvider: TimelineProvider {6 func placeholder(in context: Context) -> LaunchEntry {7 LaunchEntry(date: .now)8 }9 10 func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) {11 completion(LaunchEntry(date: .now))12 }13 14 func getTimeline(in context: Context, completion: @escaping (Timeline<LaunchEntry>) -> Void) {15 // One entry per hour for the next six hours, then WidgetKit asks again.16 let entries = TimelineSchedule.dates(from: .now, every: 60 * 60, count: 6).map(LaunchEntry.init)17 completion(Timeline(entries: entries, policy: .atEnd))18 }19}20 21struct LaunchCountdownWidget: Widget {22 let launchDay = DateComponents(calendar: .current, year: 2027, month: 1, day: 1).date ?? .now23 24 var body: some WidgetConfiguration {25 StaticConfiguration(kind: "launch", provider: LaunchProvider()) { entry in26 CountdownWidget(title: "Launch", targetDate: launchDay, referenceDate: entry.date)27 }28 .configurationDisplayName("Countdown")29 .supportedFamilies([.systemSmall])30 }31}Installation
Xcode (File › Add Package Dependencies…)
1https://github.com/muhittincamdali/iOS-Widget-Development-Kit.gitSwift Package Manager
1dependencies: [2 .package(url: "https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git", from: "2.0.0")3],4targets: [5 .target(name: "YourApp", dependencies: [6 .product(name: "WidgetDevelopmentKit", package: "iOS-Widget-Development-Kit")7 ])8]Captures d'écran






Chronologie
Dépôt ouvert
v1.0.0 étiquetée ; le manifeste à cette étiquette ne se charge pas, donc cette version ne peut pas être compilée
Simplifié en un seul target de bibliothèque d'environ 240 lignes ; le target de test ne compilait toujours pas
Reconstruit et publié en 2.0.0 (PR #28) : vues restaurées depuis l'historique et corrigées, manifeste Swift 6, tests Swift Testing, DocC, app d'exemple et CI