iOS-Widget-Development-Kit
Vistas y helpers SwiftUI para widgets de WidgetKit, gráficos, timelines, App Intents y Live Activities
Licencia: MIT
WidgetDevelopmentKit es un paquete Swift para desarrolladores que construyen widgets para sus apps de iOS. Contiene vistas SwiftUI ya hechas para widgets de Home Screen, Lock Screen y StandBy, vistas de gráficos dimensionadas para widgets, helpers para timelines y para los datos que la app comparte con su widget, App Intents para los botones del widget, y atributos y vistas de ActivityKit para Live Activities. Tú sigues escribiendo la widget extension; el paquete te ahorra las vistas y la lógica de fechas, almacenamiento y reintentos que necesita todo widget. No tiene dependencias de terceros.
Características
- Plantillas de Home Screen como weather, stats, finance, calendar, countdown, clock, fitness rings, habit tracker, to-do y water, además de 9 vistas de Swift Charts dimensionadas para widgets
- 15 vistas accesorias de Lock Screen (circular, rectangular, inline) y 7 vistas de StandBy
- Helpers de timeline: fechas de entry, políticas de reload que usan aritmética de calendario, y un snapshot store con caducidad para los datos compartidos a través de un App Group
- Widgets interactivos: 5 App Intents y 8 vistas con botones que los ejecutan
- Live Activities: 10 tipos de ActivityAttributes con vistas de Lock Screen y de Dynamic Island compacta, y una state machine que rechaza actualizaciones fuera de orden
- Un data loader que reintenta solo errores transitorios (408, 5xx, timeouts, offline) y falla rápido dentro de la widget extension
- Lógica de fechas, números y reintentos cubierta por tests de Swift Testing, incluyendo NaN, objetivos en cero y días de cambio de horario; un test mantiene los bloques de código del README sincronizados con el código compilado
Inicio rápido
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}Instalación
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]Capturas de pantalla






Cronología
Repositorio abierto
v1.0.0 etiquetada; el manifest de esta etiqueta no carga, así que esta versión no se puede compilar
Simplificado a un único library target de unas 240 líneas; el test target seguía sin compilar
Reconstruido y publicado como 2.0.0 (PR #28): vistas recuperadas del historial y corregidas, manifest de Swift 6, tests de Swift Testing, DocC, app de ejemplo y CI