iOS-Widget-Development-Kit
SwiftUI-Views und Helfer für WidgetKit-Widgets, Charts, Timelines, App Intents und Live Activities
Lizenz: MIT
WidgetDevelopmentKit ist ein Swift-Package für Entwickler, die Widgets für ihre iOS-Apps bauen. Es enthält fertige SwiftUI-Views für Home-Screen-, Lock-Screen- und StandBy-Widgets, auf Widget-Größen abgestimmte Chart-Views, Helfer für Timelines und für die Daten, die die App mit ihrem Widget teilt, App Intents für Widget-Buttons sowie ActivityKit-Attributes und -Views für Live Activities. Die Widget Extension schreiben Sie weiterhin selbst; das Package erspart Ihnen die Views sowie die Datums-, Speicher- und Retry-Logik, die jedes Widget braucht. Es hat keine Drittanbieter-Abhängigkeiten.
Funktionen
- Home-Screen-Templates wie Wetter, Statistiken, Finanzen, Kalender, Countdown, Uhr, Fitness-Ringe, Habit-Tracker, To-do und Wasser, dazu 9 auf Widget-Größen abgestimmte Swift-Charts-Views
- 15 Lock-Screen-Accessory-Views (circular, rectangular, inline) und 7 StandBy-Views
- Timeline-Helfer: Entry-Daten, Reload-Policies mit Kalenderarithmetik und ein Snapshot-Store mit Ablaufzeit für Daten, die über eine App Group geteilt werden
- Interaktive Widgets: 5 App Intents und 8 Views mit Buttons, die sie ausführen
- Live Activities: 10 ActivityAttributes-Typen mit Lock-Screen- und kompakten Dynamic-Island-Views sowie eine State Machine, die Updates in falscher Reihenfolge zurückweist
- Ein Data Loader, der nur bei vorübergehenden Fehlern (408, 5xx, Timeouts, offline) erneut versucht und innerhalb der Widget Extension schnell fehlschlägt
- Datums-, Zahlen- und Retry-Logik wird von Swift-Testing-Tests abgedeckt, einschließlich NaN, Zielwert null und Tagen mit Zeitumstellung; ein Test hält die Codeblöcke der README mit kompiliertem Code synchron
Schnellstart
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]Screenshots






Zeitleiste
Repository eröffnet
v1.0.0 getaggt; das Manifest an diesem Tag lädt nicht, daher lässt sich diese Version nicht bauen
Auf ein einziges Library-Target von rund 240 Zeilen vereinfacht; das Test-Target kompilierte weiterhin nicht
Neu aufgebaut und als 2.0.0 veröffentlicht (PR #28): Views aus der Historie wiederhergestellt und korrigiert, Swift-6-Manifest, Swift-Testing-Tests, DocC, Beispiel-App und CI