react-nativeexpo

Expo API for app updates resulting in blank white screen


I’m using Expo in the managed workflow. The app is coming along and I’ve added the ability for the app to auto-update itself. I’m using the expo-updates library: https://docs.expo.dev/versions/latest/sdk/updates and the implementation is pretty straightforward.

When our app is opened, our app’s App.tsx runs Updates.checkForUpdateAsync() and then Updates.reloadAsync(). We throw up a brief spinner and 9 out of 10 times the update works just fine. But about 1 out of 10 times the app screen goes white. The iOS header bar with time and Wi-Fi is still visible, but everything else is white. The user has to kill the app and re-open it to resume and now they’re running the latest version.

Unfortunately, this is a difficult issue to reproduce. We can’t do updates in development so we are trying to debug this in our staging environment (a mirror of production). Our repro steps are to push a trivial update to Expo, when the build completes, relaunch the app. We have to do it about ~10 times before we’ll get a freeze case.

The key code is: App.tsx runs:

newUpdate = await checkForAppUpdate()
If (newUpdate) await forceUpdate()

And then our library for these two methods is simple:

import * as Updates from 'expo-updates'
import {Platform} from "react-native"

export const checkForAppUpdate = async (): Promise<boolean> => {
    if (Platform.OS == "web" || __DEV__) return false
    try {
        const update = await Updates.checkForUpdateAsync()
        return update.isAvailable
    } catch (e) {
        console.error(e)
        return false
    }
}

export const forceUpdate = async () => {
    try {
        const result = await Updates.fetchUpdateAsync()
        if (result.isNew) {
            await Updates.reloadAsync()
        }
    } catch (e) {
        console.error(e)
    }
}

I’m at a loss for how to debug this. Any clues as to what might be going on? I’m assuming a race condition given the sporadic behavior but I’m stuck.


Solution

  • I ended up figuring this out, but it was tricky. I added all sorts of additional logging to try and catch any exception being thrown and there was not one. The issue is that I had a new dependency in my Expo build/bundle which was not yet supported by the binary version of my app I was running. I rebuilt my binary with the latest libraries and this started working again.

    So anyone else who might be faced with this issue: do an audit of all library dependencies with your app and roll back to a previous version when updating was working to isolate what changed.