Show a "What's New" Screen on App Update in SwiftUI
Greet returning users with your latest release notes — but only after they actually update. Here's the native @AppStorage pattern, with full code and the gotchas that trip people up.
"Shout out to FeaturesVote! Integration was done in under a minute"
Alexandre Negrel,
Founder at Prisme Analytics
A good "What's New" screen turns a silent update into a moment of delight — and quietly boosts feature adoption. The trick is timing: it should appear after an update, never on a fresh install, and never on every launch. The whole thing is about 60 lines of SwiftUI.
We'll build it in four steps, then look at how to avoid editing code for every single release.
Read the app's current version
Apple stores your marketing version in CFBundleShortVersionString. Read it once via a small Bundle extension so you can compare it on every launch.
Define what's new this release
Model each highlight as a simple Identifiable struct and keep the list in one place. You'll update this array each time you ship a release worth announcing.
Build the What's New view
A title, a scrollable list of highlights with SF Symbols, and a single Continue button. Keep it native, light, and skippable.
Show it only after an update
Use @AppStorage to remember the last version the user saw. Present the sheet when the stored version differs from the current one — and crucially, skip it on a fresh install so you don't interrupt first-run onboarding.
That's the whole pattern — a version check, a sheet, and one @AppStorage flag.
Three gotchas to avoid
Don't show it on first install
A brand-new user has no 'previous version', so a naive check (stored != current) fires on first launch. Record the version silently on first run and only present on a genuine version change.
Version vs build number
Compare CFBundleShortVersionString (the marketing version, e.g. 2.1) — not CFBundleVersion (the build number, e.g. 2.1.345), which changes on every TestFlight build and would pop the sheet constantly.
Hard-coded copy gets stale
Every release you have to edit the items array, ship a new binary, and wait for review. Release notes that live in your app bundle can't be fixed or localized without another submission.
The shortcut: a changelog you don't hard-code
The hand-rolled version works, but every release means editing the items array and shipping a new binary. Features.Vote gives you a native SwiftUI ChangelogView that renders the releases you publish from a dashboard — fix a typo or add a release without another App Review.
Frequently Asked Questions
Still not convinced?
Here's a full price comparison with all top competitors
Is it lacking a feature you need?
Chances are, we're already working on it. Check our roadmap
Okay, okay! Sign me up!
Start building the right features today ⚡️