Updating a mobile app without waiting for the app stores
With my check-in app it matters when it updates. If the app restarted in the middle of an event, the queue would stop. At the same time I do not want to wait for store approval for every small fix.
Updates over the air (OTA)
With Expo's update service, changes on the JavaScript side reach phones without a store release. The app quietly checks whether there is a new version, downloads it, and it takes effect on the next cold start. I never reload anything while it is running.
export async function checkForUpdateSilently(): Promise<void> {
// Release builds only: updates are disabled in dev clients and Expo Go.
if (__DEV__ || !Updates.isEnabled) return;
try {
const res = await Updates.checkForUpdateAsync();
if (res.isAvailable) {
// Downloaded now, applied on the NEXT cold start,
// so a running check-in is never interrupted by a reload.
await Updates.fetchUpdateAsync();
}
} catch {
// network error: not important, try again next time
}
}
An excerpt of real code, anonymised.
What it cannot do
- It does not deliver native changes: a new module, a permission, an icon or a change to the configuration plugins needs a new store build.
- It is switched off in development mode and in Expo Go, and only runs in a release build.
- It does not treat a network error specially: if it fails, it simply tries again next time.
The rule
Whatever is only logic or interface goes out over the air. Whatever touches the phone's capabilities goes out as a store release. So big releases are rare, fixes are quick, and nothing updates in the middle of a check-in.
Working on a similar problem?
If you are stuck, or want a second look at your solution, write to me. I am happy to look.
Write to me →More articles
When is it safe to retry a call?
A simple rule that stops someone from being admitted twice: only retry calls that are safe to repeat.
Read →Uploading large files in Laravel without breaking
How I solved uploading large videos so that one interrupted request does not take the whole upload with it.
Read →