A library that allows programmatically controlling and responding to new updates made available to your app.
The expo-updates
library allows you to programmatically control and respond to new updates made available to your app.
Android Device | Android Emulator | iOS Device | iOS Simulator | Web |
---|---|---|---|---|
-
npx expo install expo-updates
If you're installing this in a bare React Native app, you should also follow these additional installation instructions.
Most of the methods and constants in this module can only be used or tested in release mode; they do not make sense in debug builds where you always load the latest JavaScript from your computer while in development.
To test manual updates in the Expo Go app, run eas update
and then open the published version of your app with Expo Go.
To test manual updates with managed workflow standalone apps, you can create a .apk or a simulator build or , or make a release build locally with expo run:android --variant release
and expo run:ios --configuration Release
.
To test manual updates in bare workflow apps, make a release build with expo run:android --variant release
or expo run:ios --configuration Release
(you don't need to submit this build to the store to test).
The expo-updates
library exports a variety of functions to interact with updates once the app is already running. In some scenarios, you may want to check if updates are available or not. This can be done manually by using checkForUpdateAsync()
as shown in the example below:
import { View, Button } from 'react-native';
import * as Updates from 'expo-updates';
function App() {
async function onFetchUpdateAsync() {
try {
const update = await Updates.checkForUpdateAsync();
if (update.isAvailable) {
await Updates.fetchUpdateAsync();
await Updates.reloadAsync();
}
} catch (error) {
// You can also add an alert() to see the error message in case of an error when fetching updates.
alert(`Error fetching latest Expo update: ${error}`);
}
}
return (
<View>
<Button title="Fetch update" onPress={onFetchUpdateAsync} />
</View>
);
}
import * as Updates from 'expo-updates';
Updates.channel
Type: string | null
The channel name of the current build, if configured for use with EAS Update. Null otherwise.
Updates.createdAt
Type: Date | null
If expo-updates
is enabled, this is a Date
object representing the creation time of the update that's currently running (whether it was embedded or downloaded at runtime).
In development mode, or any other environment in which expo-updates
is disabled, this value is
null.
Updates.isEmergencyLaunch
Type: boolean
expo-updates
does its very best to always launch monotonically newer versions of your app so
you don't need to worry about backwards compatibility when you put out an update. In very rare
cases, it's possible that expo-updates
may need to fall back to the update that's embedded in
the app binary, even after newer updates have been downloaded and run (an "emergency launch").
This boolean will be true
if the app is launching under this fallback mechanism and false
otherwise. If you are concerned about backwards compatibility of future updates to your app, you
can use this constant to provide special behavior for this rare case.
Updates.manifest
If expo-updates
is enabled, this is the
manifest object for the update that's currently
running.
In development mode, or any other environment in which expo-updates
is disabled, this object is
empty.
Updates.releaseChannel
Type: string
The name of the release channel currently configured in this standalone or bare app when using
classic updates. When using Expo Updates, the value of this field is always "default"
.
Updates.updateId
Type: string | null
The UUID that uniquely identifies the currently running update if expo-updates
is enabled. The
UUID is represented in its canonical string form (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
) and
will always use lowercase letters. In development mode, or any other environment in which
expo-updates
is disabled, this value is null
.
Updates.checkForUpdateAsync()
Checks the server to see if a newly deployed update to your project is available. Does not actually download the update. This method cannot be used in development mode, and the returned promise will be rejected if you try to do so.
Checking for an update uses a device's bandwidth and battery life like any network call. Additionally, updates served by Expo may be rate limited. A good rule of thumb to check for updates judiciously is to check when the user launches or foregrounds the app. Avoid polling for updates in a frequent loop.
Returns
A promise that fulfills with an UpdateCheckResult
object.
The promise rejects if the app is in development mode, or if there is an unexpected error or timeout communicating with the server.
Updates.fetchUpdateAsync()
Downloads the most recently deployed update to your project from server to the device's local storage. This method cannot be used in development mode, and the returned promise will be rejected if you try to do so.
Returns
A promise that fulfills with an UpdateFetchResult
object.
The promise rejects if the app is in development mode, or if there is an unexpected error or timeout communicating with the server.
Updates.reloadAsync()
Instructs the app to reload using the most recently downloaded version. This is useful for triggering a newly downloaded update to launch without the user needing to manually restart the app.
It is not recommended to place any meaningful logic after a call to await Updates.reloadAsync()
. This is because the promise is resolved after verifying that the app can
be reloaded, and immediately before posting an asynchronous task to the main thread to actually
reload the app. It is unsafe to make any assumptions about whether any more JS code will be
executed after the Updates.reloadAsync
method call resolves, since that depends on the OS and
the state of the native module and main threads.
This method cannot be used in development mode, and the returned promise will be rejected if you try to do so.
Returns
Promise<void>
A promise that fulfills right before the reload instruction is sent to the JS runtime, or
rejects if it cannot find a reference to the JS runtime. If the promise is rejected in production
mode, it most likely means you have installed the module incorrectly. Double check you've
followed the installation instructions. In particular, on iOS ensure that you set the bridge
property on EXUpdatesAppController
with a pointer to the RCTBridge
you want to reload, and on
Android ensure you either call UpdatesController.initialize
with the instance of
ReactApplication
you want to reload, or call UpdatesController.setReactNativeHost
with the
proper instance of ReactNativeHost
.
Updates.addListener(listener)
Name | Type | Description |
---|---|---|
listener | (event: UpdateEvent) => void | A function that will be invoked with an |
Adds a callback to be invoked when updates-related events occur (such as upon the initial app load) due to auto-update settings chosen at build-time.
Returns
EventSubscription
An EventSubscription
object on which you can call remove()
to unsubscribe the
listener.
UpdateCheckResult
The result of checking for a new update.
Name | Type | Description |
---|---|---|
isAvailable | boolean |
|
manifest (optional) | Manifest | If |
UpdateEvent
An object that is passed into each event listener when an auto-update check occurs.
Name | Type | Description |
---|---|---|
manifest (optional) | Manifest | If |
message (optional) | string | If |
type | UpdateEventType | Type of the event. |
UpdateFetchResult
The result of fetching a new update.
Name | Type | Description |
---|---|---|
isNew | boolean |
|
manifest (optional) | Manifest | If |
NO_UPDATE_AVAILABLE
UpdateEventType.NO_UPDATE_AVAILABLE = "noUpdateAvailable"
No updates are available, and the most up-to-date update is already running.
UPDATE_AVAILABLE
UpdateEventType.UPDATE_AVAILABLE = "updateAvailable"
A new update has finished downloading to local storage. If you would like to start using this
update at any point before the user closes and restarts the app on their own, you can call
Updates.reloadAsync()
to launch this new update.
Code | Description |
---|---|
ERR_UPDATES_DISABLED | A method call was attempted when the Updates module was disabled, or the application was running in development mode |
ERR_UPDATES_RELOAD | An error occurred when trying to reload the application and it could not be reloaded. For bare workflow apps, double check the setup steps for this module to ensure it has been installed correctly and the proper native initialization methods are called. |
ERR_UPDATES_CHECK | An unexpected error occurred when trying to check for new updates. Check the error message for more information. |
ERR_UPDATES_FETCH | An unexpected error occurred when trying to fetch a new update. Check the error message for more information. |