How iOS widget refresh actually works (and why your widget looks stale)
· WidgetAI
You glance at a widget on your Home Screen, see a number that's clearly wrong — a battery reading from two hours ago, a price that hasn't moved since breakfast — and wonder if the app is broken. Usually it isn't. iOS widgets update on rules that are stricter and stranger than most people expect, and once you understand them, a lot of "why won't this refresh" moments start to make sense.
We build a widget app, so we run into these rules every day. Here's how the system actually works, why things look stale, and what you can do about it.
A widget is not a tiny app
The first surprise is that a widget isn't your app running in a little box on the Home Screen. It's a snapshot. iOS asks the app to draw what the widget should look like, keeps that picture, and shows it to you. The app itself isn't awake while you're looking at it.
Apple's framework for this is called WidgetKit, and it works on a timeline. Instead of asking "what does the widget look like right now" every second, iOS asks the app for a batch of snapshots covering the next stretch of time, each stamped with the moment it should appear. A clock widget, for example, can hand over a snapshot for every minute of the next hour in one go. The system files them away and swaps them in on schedule, without waking the app again.
This is a deliberate trade. It's how you can have a dozen widgets on your Home Screen without your battery draining or your phone getting warm. The cost is that widgets are, by design, a little behind. They show a picture that was drawn earlier.
The refresh budget
Widgets can also ask iOS to rebuild their timeline — to come back later and get fresh data. But the system doesn't grant those requests freely. Each app gets a limited number of background refreshes per day, and iOS decides how to spend that budget.
Apple's guidance puts this at roughly 40 to 70 background refreshes a day, depending on how you use the widget. That's not a fixed number you can count on; it's a range the system tunes. Spread across a day, 40 to 70 refreshes works out to somewhere around one every 15 to 40 minutes at best — nowhere near real time. You can read Apple's own explanation in the WidgetKit documentation on keeping a widget up to date.
A few things move that budget up or down:
- How often you actually look at the widget. Widgets you view often get refreshed more generously. One buried on your last Home Screen page gets less.
- Charging and battery level. A plugged-in phone is more willing to spend refreshes than one running low.
- Low Power Mode. When it's on, iOS cuts background work hard, and widget refreshes are some of the first things to go.
So the same widget can feel snappy one afternoon and sluggish the next, and nothing changed in the app. The system simply had a different budget to spend.
Why a "live" value freezes
Here's the trap that catches people most, and it's worth understanding because it explains the weirdest kind of staleness.
Remember that a timeline is a batch of snapshots drawn ahead of time. If a widget shows a value that changes — your battery percentage, a heart rate, a stock price — that value gets frozen into each snapshot at the moment the snapshot is drawn. If the app builds an hour of snapshots and only reads your battery once at the start, every snapshot for that whole hour shows the same battery number. It can look hours old even though the widget is "updating" on schedule, because the picture is current but the data inside it isn't.
The fix is to read the live value fresh for each entry in the timeline and bake it into that snapshot, rather than reading it once and reusing it. It sounds obvious written down, but it's an easy mistake, and it's one we hit and engineered around in our own on-device widgets — battery in particular. (There's a separate wrinkle with battery specifically: iOS only reports it in 5% steps, so even a perfectly fresh reading jumps in chunks. We wrote about that in our iPhone battery widget guide.)
What you can do about a stale widget
If a widget is lagging more than you'd like, a few things genuinely help:
- Check Background App Refresh. Go to Settings, then General, then Background App Refresh, and make sure it's on for the app. With it off, the widget can only update when you open the app.
- Come off Low Power Mode. If your battery's in the yellow and refreshes have slowed to a crawl, that's often why. Low Power Mode throttles exactly this kind of background work.
- Look at the widget more. It sounds silly, but iOS really does refresh widgets you engage with more often. A widget you never look at is one the system deprioritizes.
- Adjust your expectations a little. A widget will lag by design. It's a snapshot on a schedule, not a live dashboard. Even a perfectly built widget can be a few minutes to half an hour behind, and that's the system working as intended — not a bug.
How WidgetAI handles it honestly
WidgetAI builds custom iPhone widgets from a chat — you describe what you want and the AI designs it. Because we live inside these constraints, we've tried to be straight about them rather than pretend they don't exist.
A few things we do:
- You pick the refresh interval. For each widget you can choose how often it tries to update, from every minute to hourly. "Every minute" is a target, not a promise — iOS still decides based on your budget — but it tells the system how eager to be.
- We cache connector data on our servers with per-source freshness windows. For internet data like weather, a crypto price, or a stock, the app fetches from us, and we hold a recent value with a freshness window that fits the source. That way a refresh spends its budget on showing you data, not waiting on a slow upstream API.
- On-device signals are baked per entry. For values read from your phone — battery, location, HealthKit and the rest — we read them fresh for each timeline entry so they don't freeze at the value from when the timeline was built.
What we won't do is promise real-time updates. No widget app can, because none of us control the refresh budget — Apple does. Anyone claiming second-by-second live widgets is either misunderstanding the system or hoping you don't. Widgets are a wonderful, glanceable, low-power part of iOS, and they're a little behind on purpose. The honest goal is to make them as fresh as the system allows, and to be clear about the rest. It's also worth knowing the other things iOS widgets can't do before you build one.
FAQ
Why is my widget not updating at all? Most often, Background App Refresh is turned off for the app, or you're in Low Power Mode. Check Settings, then General, then Background App Refresh. If it's on and you're not in Low Power Mode, the widget may just be waiting on its next scheduled refresh.
What's the fastest an iPhone widget can refresh? There's no guaranteed rate. Apple's budget works out to roughly 40 to 70 background refreshes a day, so in practice the best you'll typically see is an update every 15 minutes or so, and often less frequently. Opening the app forces a fresh read on the spot.
Why does my widget show old data even though it looks like it refreshed? This is the frozen-value trap: the snapshot is current but the live number inside it was read once when the timeline was built and never updated. A well-built widget reads the value fresh for each snapshot. It's a common bug, and it's one we specifically designed around.
Does looking at my widget more make it update faster? Yes, to a point. iOS refreshes widgets you engage with more generously than ones you ignore, so a widget you actually use tends to stay fresher.
WidgetAI is made for iPhone and Mac, and it's available on the App Store. The free plan gives you 3 widgets and 20 AI edits a month; Pro lifts those limits as an in-app purchase.