What Are iOS Widgets?
Widgets were introduced in iOS 14 and have grown every year since — Lock Screen widgets in iOS 16, interactive widgets in iOS 17, StandBy widgets on iOS 17+, and richer Material-ish widgets in iOS 18+.
Conceptually, a widget is a SwiftUI view that the system snapshots periodically and renders outside your app. Your app supplies a timeline of future values it expects to show, and iOS picks when to render which entry. Widgets cannot animate freely or run continuous code — that is the contract that lets them sit on the Home Screen all day without draining your battery.
Where iOS Widgets Live
Home Screen
Small, medium, large, and extra-large tiles you can pin in place of (or alongside) app icons.
Lock Screen
Inline text under the clock, plus circular and rectangular widgets above it.
Today View (swipe right)
The legacy widget feed. Still useful and still supported.
StandBy mode (iOS 17+)
When the iPhone is on a charger in landscape, widgets render large and rotate via Smart Stack.
iPad Home Screen and Lock Screen
Same widget kinds as iPhone, plus the extra-large family.
macOS Sonoma+ desktop
iOS widgets render on the Mac desktop and in Notification Center via a continuity feature.
Widget Sizes & Families
Home Screen sizes
systemSmall (2x2 grid spaces), systemMedium (4x2), systemLarge (4x4), systemExtraLarge (4x4 wider on iPad). Pixel size depends on device.
Lock Screen sizes
accessoryInline (single line below the clock), accessoryCircular (icon or gauge), accessoryRectangular (small banner). Tinted for legibility.
StandBy sizes
systemSmall and systemMedium widgets are auto-promoted into StandBy. Optimize your design for the larger render.
How the Widget Refresh Budget Works
Widgets do not run continuously. Your widget extension is asked for a timeline — an array of TimelineEntry values with future dates. iOS pre-renders these on its own clock and picks one to show based on the entry's date and the system load.
- Apple targets “a few dozen reloads per day” per widget — so do not expect a refresh every minute.
- Reload “hints” like
WidgetCenter.shared.reloadAllTimelines()ask iOS to refresh, but the system still decides. - Use
.never,.atEnd, or.after(date)reload policies to express intent. - Network calls inside the widget are best handled by background fetches in your main app, then shared via App Groups.
If you need real-time, this is where Live Activities take over.
Interactive Widgets (iOS 17+)
Since iOS 17 widgets can include Button and Toggle controls backed by App Intents. The intent runs in the background; the widget then refreshes to show the new state.
Good interactive-widget patterns:
- Marking a Reminder or to-do as done.
- Toggling a HomeKit accessory or shortcut.
- Skipping or pausing audio playback.
- Casting a vote or saving for later.
- Quick-add actions (water intake, expense, journal).
Widgets vs Live Activities
Widgets
Permanent, ambient, refresh on a schedule, support multiple sizes, can be interactive but not real-time.
Live Activities
Temporary, event-driven, update in real time on Lock Screen + Dynamic Island, dismissed when the event ends.
Both ship inside the same WidgetKit extension target. A weather app, for example, might have a Home Screen widget showing today's forecast and a Live Activity that appears only during a severe-weather alert. For more, see iOS Live Activities and Dynamic Island.
How to Build an iOS Widget
- In Xcode, add a new Widget Extension target to your app.
- Define a
TimelineEntrystruct and aTimelineProvider. - Build a SwiftUI view for each supported widget family.
- Configure a
StaticConfigurationorAppIntentConfigurationin the widget's entry point. - Share data with your main app via an App Group +
UserDefaultsor a shared SQLite/Core Data store. - Call
WidgetCenter.shared.reloadAllTimelines()from your app whenever data changes meaningfully.
If you are building cross-platform with React Native or Expo, the widget itself stays SwiftUI but the data layer can come from JavaScript via a small native module. Newly automates the whole thing.