Force-update gate
Operating the CMS-managed minimum-version gate for the native mobile app.
The force-update gate is a full-screen, non-dismissible mobile state for native builds below a configured minimum version. Use it only when compatibility or safety requires users to install a newer store build. The web app has no equivalent because it is served at the deployed version.
Contentful entry
The app reads the most recently published PageForceUpdate entry.
| Field | Behavior |
|---|---|
internalName | Editor label. |
title / body | Gate copy. |
updateCta | ComponentButton label and store URL. Without a URL the update button is disabled. |
minVersion | Minimum allowed native version, preferably MAJOR.MINOR.PATCH. |
effectiveAt | Optional start time for a coordinated rollout. |
active | Master switch. false allows every version. |
Decision rule
A production build is gated only when all conditions are true:
activeis true;effectiveAtis absent or has passed; andexpo-applicationreports a native application version lower thanminVersion.
The comparator accepts one to three numeric segments, pads missing segments with zero, and ignores -prerelease or +build suffixes. An unparseable current or minimum version fails open instead of locking users out. Local __DEV__ builds are always allowed.
Cache, resume, and offline behavior
The query is stale after five minutes and is checked on mount and app foreground. Its garbage-collection time is infinite so the last successful gate can remain in the persisted React Query cache. A network failure therefore keeps the prior decision instead of automatically unlocking a device that was already gated.
An over-the-air JavaScript update does not change nativeApplicationVersion; only a new native store build can satisfy a higher minimum native version.
Safe operating procedure
- Confirm the target store build is available to the intended audience.
- Publish the entry with
active: falseand verify its copy, URL, and semantic version. - Set
effectiveAtif the rollout needs a future start. - Activate the entry and test one below-minimum and one allowed build.
- Use
active: falseas the immediate rollback.
Implementation lives under apps/mobile/src/features/force-update/; the CMS query is packages/cms/src/lib/graphql/pageForceUpdate.graphql.