@capawesome/capacitor-app-update
v8.0.5
Published
Capacitor plugin that assists with app updates on Android and iOS.
Maintainers
Readme
Capacitor App Update Plugin
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. 🚀
Features
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!
Use Cases
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.
Compatibility
| 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 |
Installation
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 syncAndroid Variables
If 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.
Configuration
No configuration required for this plugin.
Demo
A working example can be found here: robingenz/capacitor-plugin-demo
Usage
The following examples show how to get app update information, open the app store entry, and perform immediate and flexible in-app updates.
Get app update information
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 store entry
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 update
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 update
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 update
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();
};API
getAppUpdateInfo(...)openAppStore(...)performImmediateUpdate()startFlexibleUpdate()completeFlexibleUpdate()addListener('onFlexibleUpdateStateChange', ...)removeAllListeners()- Interfaces
- Enums
getAppUpdateInfo(...)
getAppUpdateInfo(options?: GetAppUpdateInfoOptions | undefined) => Promise<AppUpdateInfo>Returns app update informations.
Only available on Android and iOS.
| Param | Type |
| ------------- | --------------------------------------------------------------------------- |
| options | GetAppUpdateInfoOptions |
Returns: Promise<AppUpdateInfo>
openAppStore(...)
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 |
performImmediateUpdate()
performImmediateUpdate() => Promise<AppUpdateResult>Performs an immediate in-app update.
Only available on Android.
Returns: Promise<AppUpdateResult>
startFlexibleUpdate()
startFlexibleUpdate() => Promise<AppUpdateResult>Starts a flexible in-app update.
Only available on Android.
Returns: Promise<AppUpdateResult>
completeFlexibleUpdate()
completeFlexibleUpdate() => Promise<void>Completes a flexible in-app update by restarting the app.
Only available on Android.
addListener('onFlexibleUpdateStateChange', ...)
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()
removeAllListeners() => Promise<void>Remove all listeners for this plugin.
Interfaces
AppUpdateInfo
| 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. | |
GetAppUpdateInfoOptions
| 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. |
OpenAppStoreOptions
| 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 |
| 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). Only available on iOS. | 6.1.0 |
AppUpdateResult
| Prop | Type |
| ---------- | ------------------------------------------------------------------- |
| code | AppUpdateResultCode |
PluginListenerHandle
| Prop | Type |
| ------------ | ----------------------------------------- |
| remove | () => Promise<void> |
FlexibleUpdateState
| 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. |
Enums
AppUpdateAvailability
| Members | Value |
| -------------------------- | -------------- |
| UNKNOWN | 0 |
| UPDATE_NOT_AVAILABLE | 1 |
| UPDATE_AVAILABLE | 2 |
| UPDATE_IN_PROGRESS | 3 |
FlexibleUpdateInstallStatus
| Members | Value |
| ----------------- | --------------- |
| UNKNOWN | 0 |
| PENDING | 1 |
| DOWNLOADING | 2 |
| INSTALLING | 3 |
| INSTALLED | 4 |
| FAILED | 5 |
| CANCELED | 6 |
| DOWNLOADED | 11 |
AppUpdateResultCode
| 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. |
Test with internal app-sharing
The Android Developers documentation describes how to test in-app updates using internal app sharing.
FAQ
What is the difference between this plugin and the Live Update plugin?
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.
Are in-app updates available on iOS?
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.
What is the difference between an immediate and a flexible update?
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.
Why does the update fail with the INFO_MISSING result code?
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().
How can I test in-app updates on Android?
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.
Can I use this plugin with Ionic, React, Vue or Angular?
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.
Related Plugins
- App Review: Let users submit app store reviews and ratings.
- Live Update: Update your app remotely in real-time without requiring users to download a new version from the app store.
Newsletter
Stay up to date with the latest news and updates about the Capawesome, Capacitor, and Ionic ecosystem by subscribing to our Capawesome Newsletter.
Changelog
See CHANGELOG.md.
License
See LICENSE.
Credits
This plugin is based on the Capacitor App Update plugin. Thanks to everyone who contributed to the project!
