Skip to content
Rapcsány Krisztián Rapcsány Krisztián
hu
← All articles
2 min read

Updating a mobile app without waiting for the app stores

React Native Expo Mobile

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.

updates.ts
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 →
Get a quote →