Capacitor plugin that assists with native app updates. It supports retrieving app update information on Android and iOS and supports in-app updates on Android.
Check out the Capacitor Live Update plugin to update your app remotely in real-time without submitting a new version to the app store. 🚀
The Capacitor App Update plugin is one of the most complete native app update solutions for Capacitor apps. Here are some of the key features:
- 🖥️ Cross-platform: Supports Android and iOS.
- 📱 App update information: Retrieves current and available app versions.
- ⚡ Immediate in-app updates: Performs immediate updates on Android.
- 📲 Flexible in-app updates: Supports flexible update flows on Android.
- 📈 Update priority: Supports update priority levels on Android.
- 🏪 App store navigation: Opens the app store entry for manual updates.
- 📊 Update state tracking: Monitors flexible update progress with listeners.
- 🤝 Compatibility: Works alongside the Live Update plugin.
- 🔁 Up-to-date: Always supports the latest Capacitor version.
Missing a feature? Just open an issue and we'll take a look!
The App Update plugin is typically used to make sure users are running a recent version of your app, for example:
- Force updates: Perform an immediate in-app update on Android when a critical new version must be installed before the app can be used.
- Optional update prompts: Start a flexible in-app update on Android that downloads in the background and track its progress with the state change listener.
- Version checks: Compare the current app version with the version available in the Play Store or App Store to decide whether to inform the user.
- Store redirects: Open the app's Play Store or App Store entry so the user can update the app manually, for example on iOS where in-app updates are not available.
| Plugin Version | Capacitor Version | Status |
|---|---|---|
| 8.x.x | >=8.x.x | Active support |
| 7.x.x | 7.x.x | Deprecated |
| 6.x.x | 6.x.x | Deprecated |
| 5.x.x | 5.x.x | Deprecated |
A working example can be found here: robingenz/capacitor-plugin-demo
You can use our AI-Assisted Setup to install the plugin. Add the Capawesome Skills to your AI tool using the following command:
npx skills add capawesome-team/skills --skill capacitor-pluginsThen use the following prompt:
Use the `capacitor-plugins` skill from `capawesome-team/skills` to install the `@capawesome/capacitor-app-update` plugin in my project.
If you prefer Manual Setup, install the plugin by running the following commands and follow the platform-specific instructions below:
npm install @capawesome/capacitor-app-update
npx cap syncIf needed, you can define the following project variable in your app’s variables.gradle file to change the default version of the dependency:
$androidPlayAppUpdateVersionversion ofcom.google.android.play:app-update(default:2.1.0)$androidPlayServicesBaseVersionversion ofcom.google.android.gms:play-services-base(default:18.9.0)
This can be useful if you encounter dependency conflicts with other plugins in your project.
No configuration required for this plugin.
The following examples show how to get app update information, open the app store entry, and perform immediate and flexible in-app updates.
Use getAppUpdateInfo() to retrieve the current and available app versions. On Android, versions are identified by the version code; on iOS, by the version name. Only available on Android and iOS:
import { AppUpdate } from '@capawesome/capacitor-app-update';
import { Capacitor } from '@capacitor/core';
const getCurrentAppVersion = async () => {
const result = await AppUpdate.getAppUpdateInfo();
if (Capacitor.getPlatform() === 'android') {
return result.currentVersionCode;
} else {
return result.currentVersionName;
}
};
const getAvailableAppVersion = async () => {
const result = await AppUpdate.getAppUpdateInfo();
if (Capacitor.getPlatform() === 'android') {
return result.availableVersionCode;
} else {
return result.availableVersionName;
}
};Open the app's page in the Play Store (Android) or App Store (iOS) so the user can update the app manually. Only available on Android and iOS:
import { AppUpdate } from '@capawesome/capacitor-app-update';
const openAppStore = async () => {
await AppUpdate.openAppStore();
};Perform an immediate in-app update if an update is available and an immediate update is allowed. Only available on Android:
import { AppUpdate, AppUpdateAvailability } from '@capawesome/capacitor-app-update';
const performImmediateUpdate = async () => {
const result = await AppUpdate.getAppUpdateInfo();
if (result.updateAvailability !== AppUpdateAvailability.UPDATE_AVAILABLE) {
return;
}
if (result.immediateUpdateAllowed) {
await AppUpdate.performImmediateUpdate();
}
};Start a flexible in-app update if an update is available and a flexible update is allowed. You can monitor the download progress with the onFlexibleUpdateStateChange listener. Only available on Android:
import { AppUpdate, AppUpdateAvailability } from '@capawesome/capacitor-app-update';
const startFlexibleUpdate = async () => {
const result = await AppUpdate.getAppUpdateInfo();
if (result.updateAvailability !== AppUpdateAvailability.UPDATE_AVAILABLE) {
return;
}
if (result.flexibleUpdateAllowed) {
await AppUpdate.startFlexibleUpdate();
}
};Complete a flexible in-app update by restarting the app. Only available on Android:
import { AppUpdate } from '@capawesome/capacitor-app-update';
const completeFlexibleUpdate = async () => {
await AppUpdate.completeFlexibleUpdate();
};getAppUpdateInfo(...)openAppStore(...)performImmediateUpdate()startFlexibleUpdate()completeFlexibleUpdate()addListener('onFlexibleUpdateStateChange', ...)removeAllListeners()- Interfaces
- Enums
getAppUpdateInfo(options?: GetAppUpdateInfoOptions | undefined) => Promise<AppUpdateInfo>Returns app update informations.
Only available on Android and iOS.
| Param | Type |
|---|---|
options |
GetAppUpdateInfoOptions |
Returns: Promise<AppUpdateInfo>
openAppStore(options?: OpenAppStoreOptions | undefined) => Promise<void>Opens the app store entry of the app in the Play Store (Android) or App Store (iOS).
Only available on Android and iOS.
| Param | Type |
|---|---|
options |
OpenAppStoreOptions |
Since: 1.0.0
performImmediateUpdate() => Promise<AppUpdateResult>Performs an immediate in-app update.
Only available on Android.
Returns: Promise<AppUpdateResult>
startFlexibleUpdate() => Promise<AppUpdateResult>Starts a flexible in-app update.
Only available on Android.
Returns: Promise<AppUpdateResult>
completeFlexibleUpdate() => Promise<void>Completes a flexible in-app update by restarting the app.
Only available on Android.
addListener(eventName: 'onFlexibleUpdateStateChange', listenerFunc: (state: FlexibleUpdateState) => void) => Promise<PluginListenerHandle>Adds a flexbile in-app update state change listener.
Only available on Android.
| Param | Type |
|---|---|
eventName |
'onFlexibleUpdateStateChange' |
listenerFunc |
(state: FlexibleUpdateState) => void |
Returns: Promise<PluginListenerHandle>
removeAllListeners() => Promise<void>Remove all listeners for this plugin.
| Prop | Type | Description | Since |
|---|---|---|---|
currentVersionName |
string |
The current version name of the app. On Android, this is the versionName from the android/app/build.gradle file. On iOS, this is the CFBundleShortVersionString from the Info.plist file. Only available on Android and iOS. |
5.1.0 |
availableVersionName |
string |
The available version name of the update. On iOS, this is the CFBundleShortVersionString from the Info.plist file. Only available on iOS. |
5.1.0 |
currentVersionCode |
string |
The current version code of the app. On Android, this is the versionCode from the android/app/build.gradle file. On iOS, this is the CFBundleVersion from the Info.plist file. Only available on Android and iOS. |
5.1.0 |
availableVersionCode |
string |
The available version code of the update. On Android, this is the versionCode from the android/app/build.gradle file. Only available on Android. |
5.1.0 |
availableVersionReleaseDate |
string |
Release date of the update in ISO 8601 (UTC) format. Only available on iOS. | |
updateAvailability |
AppUpdateAvailability |
The app update availability. Only available on Android and iOS. | |
updatePriority |
number |
In-app update priority for this update, as defined by the developer in the Google Play Developer API. Only available on Android. | |
immediateUpdateAllowed |
boolean |
true if an immediate update is allowed, otherwise false. Only available on Android. |
|
flexibleUpdateAllowed |
boolean |
true if a flexible update is allowed, otherwise false. Only available on Android. |
|
clientVersionStalenessDays |
number |
Number of days since the Google Play Store app on the user's device has learnt about an available update if an update is available or in progress. Only available on Android. | |
installStatus |
FlexibleUpdateInstallStatus |
Flexible in-app update install status. Only available on Android. | |
minimumOsVersion |
string |
The minimum version of the operating system required for the app to run in iOS. Only available on iOS. |
| Prop | Type | Description |
|---|---|---|
country |
string |
The two-letter country code for the store you want to search. See http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 for a list of ISO Country Codes. Only available on iOS. |
| Prop | Type | Description | Since |
|---|---|---|---|
androidPackageName |
string |
The package name of the app to open in the Play Store. On Android, this is the application ID of your app (e.g. com.example.app). You can find the ID in the android/app/build.gradle file. If not provided, the current app's package name will be used. Only available on Android. |
7.2.0 |
androidStorePackageName |
string |
The package name of the store app that should open the app store entry (e.g. com.android.vending for the Google Play Store). If not provided, the system's default handler for market:// links will be used. Only available on Android. |
8.1.0 |
appId |
string |
The app ID of the app to open in the App Store. On iOS, this is the Apple ID of your app (e.g. 123456789). You can find the ID in the URL of your app store entry (e.g. https://apps.apple.com/app/id123456789). Attention: This option is required on iOS. Only available on iOS. |
6.1.0 |
| Prop | Type |
|---|---|
code |
AppUpdateResultCode |
| Prop | Type |
|---|---|
remove |
() => Promise<void> |
| Prop | Type | Description |
|---|---|---|
installStatus |
FlexibleUpdateInstallStatus |
Flexible in-app update install status. |
bytesDownloaded |
number |
Returns the number of bytes downloaded so far. undefined if the install status is other than DOWNLOADING. |
totalBytesToDownload |
number |
Returns the total number of bytes to be downloaded for this update. undefined if the install status is other than DOWNLOADING. |
| Members | Value |
|---|---|
UNKNOWN |
0 |
UPDATE_NOT_AVAILABLE |
1 |
UPDATE_AVAILABLE |
2 |
UPDATE_IN_PROGRESS |
3 |
| Members | Value |
|---|---|
UNKNOWN |
0 |
PENDING |
1 |
DOWNLOADING |
2 |
INSTALLING |
3 |
INSTALLED |
4 |
FAILED |
5 |
CANCELED |
6 |
DOWNLOADED |
11 |
| Members | Value | Description |
|---|---|---|
OK |
0 |
The user has accepted the update. |
CANCELED |
1 |
The user has denied or cancelled the update. |
FAILED |
2 |
Some other error prevented either the user from providing consent or the update to proceed. |
NOT_AVAILABLE |
3 |
No update available. |
NOT_ALLOWED |
4 |
Update type not allowed. |
INFO_MISSING |
5 |
App update info missing. You must call getAppUpdateInfo() before requesting an update. |
The Android Developers documentation describes how to test in-app updates using internal app sharing.
The App Update plugin assists with native app updates that are distributed through the Play Store or App Store, for example by retrieving update information or performing in-app updates on Android. The Capacitor Live Update plugin, on the other hand, updates your app remotely in real-time without submitting a new version to the app store.
No, in-app updates are a feature of the Google Play Store and are therefore only available on Android. On iOS, you can use getAppUpdateInfo(...) to check whether an update is available and then call openAppStore(...) to open the app's App Store entry so the user can update manually.
An immediate update is performed in one step with performImmediateUpdate(). A flexible update is started with startFlexibleUpdate(), its download progress can be monitored with the onFlexibleUpdateStateChange listener, and it is completed by calling completeFlexibleUpdate(), which restarts the app. Both update types are only available on Android.
The INFO_MISSING result code means that the app update information is missing. You must call getAppUpdateInfo(...) before requesting an update with performImmediateUpdate() or startFlexibleUpdate().
The Android Developers documentation describes how to test in-app updates using internal app sharing. See the Test with internal app-sharing section for the relevant links.
Yes, the plugin is framework-agnostic. It works in any Capacitor app regardless of the web framework, including Ionic with Angular, React, or Vue, as well as plain JavaScript projects.
- App Review: Let users submit app store reviews and ratings.
- Google Play Services: Check whether Google Play Services is available on the device and prompt the user to install or update it.
- Live Update: Update your app remotely in real-time without requiring users to download a new version from the app store.
Stay up to date with the latest news and updates about the Capawesome, Capacitor, and Ionic ecosystem by subscribing to our Capawesome Newsletter.
See CHANGELOG.md.
See LICENSE.
This plugin is based on the Capacitor App Update plugin. Thanks to everyone who contributed to the project!