Skip to content

Latest commit

 

History

History

README.md

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

Demo

A working example can be found here: robingenz/capacitor-plugin-demo

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-plugins

Then 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 sync

Android 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:

  • $androidPlayAppUpdateVersion version of com.google.android.play:app-update (default: 2.1.0)
  • $androidPlayServicesBaseVersion version of com.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.

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(...)

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

Since: 1.0.0


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
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

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.
  • 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.

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!