-
WidgetKit foundations
Widgets highlight your app's most important content across the system, providing people with another opportunity to engage. Discover the different types of widgets and explore the qualities that make them memorable. Learn how to create widgets, keep them up to date, and offer ways for people to customize them through App Intents and dynamic styling.
Chapters
- 0:01 - Introduction
- 1:03 - Fundamentals
- 13:15 - Integrate with your app
- 17:04 - Adapt with the system
Resources
Related Videos
WWDC26
WWDC25
WWDC23
WWDC21
-
Search this video…
-
-
3:50 - DailyReadingGoalWidget
struct DailyReadingGoalWidget: Widget { let kind = "DailyReadingGoalWidget" var body: some WidgetConfiguration { StaticConfiguration( kind: kind, provider: DailyReadingGoalProvider() ) { entry in DailyReadingGoalView(book: entry.book, message: entry.message, timeOfDay: entry.timeOfDay) .environment(\.colorScheme, .dark) .containerBackground(for: .widget) { Background() } } } } -
12:25 - Supported Families
struct DailyReadingGoalWidget: Widget { let kind = "DailyReadingGoalWidget" var body: some WidgetConfiguration { StaticConfiguration( kind: kind, provider: DailyReadingGoalProvider() ) { entry in DailyReadingGoalView(book: entry.book, message: entry.message, timeOfDay: entry.timeOfDay) .environment(\.colorScheme, .dark) .containerBackground(for: .widget) { Background() } } .supportedFamilies([.systemMedium]) } } -
14:03 - Adding deep links
struct DailyReadingGoalWidget: Widget { let kind = "DailyReadingGoalWidget" var body: some WidgetConfiguration { StaticConfiguration( kind: kind, provider: DailyReadingGoalProvider() ) { entry in DailyReadingGoalView(book: entry.book, message: entry.message, timeOfDay: entry.timeOfDay) .environment(\.colorScheme, .dark) .containerBackground(for: .widget) { Background() } .widgetURL(URL(string: "bookclub://reading/\(book.bookID)")) } .supportedFamilies([.systemMedium]) } } -
18:17 - Accented rendering mode
struct BookCoverImage: View { let imageName: String var body: some View { Image(imageName: bundle: .main) .widgetAccentedRenderingMode(.fullColor) } }
-
-
- 0:01 - Introduction
Widgets highlight your app's most important content across the system. The best widgets are glanceable, relevant, and personalizable. Learn how to build your first widget and keep it up to date, extending the reach of your app across platforms with WidgetKit and SwiftUI.
- 1:03 - Fundamentals
Widgets should be glanceable, relevant, and personalizable. They are built by creating a widget extension that exposes a timeline of TimelineEntry values. Each TimelineEntry provides the data to render a SwiftUI view at a particular moment in time. Learn how to define a widget with a StaticConfiguration or AppIntentConfiguration, build a quality TimelineProvider, and select a timeline reload policy to keep your widget up to date. Discover the various sizes and placements for widgets with .supportedFamilies — including the new systemExtraLargePortrait family coming to macOS, iOS, and iPadOS 27.
- 13:15 - Integrate with your app
WidgetKit offers three key integration points to tighten the connection between a widget and your app. Deep links route taps directly to specific content in your app. Configurable widgets let people personalize widget content. Interactive elements that let people perform the most important actions from within your app using App Intents.
- 17:04 - Adapt with the system
Widgets are dynamic and adapt with the system appearance modes like full color, tinted, and clear. SwiftUI handles most of the adaptation automatically, though you can customize the behavior of particular Views with the .widgetAccentedRenderingMode(.fullColor) modifier. Learn techniques to test your widgets for considerations with appearance modes and budgeted reloads.