Skip to main content

0.2.1

General

RuStore In-app updates SDK enable users to be kept up to date with the latest app version on their device. This allows them to stay informed about any performance enhancements or bug fixes that have been implemented.

User scenario example

Additionally, the SDK offers the ability to notify users of a new version and provide an option to install it. The installation process can occur in the background, while the user can track the progress of the update.

Explore example code on Unity >>

img

Prerequisites

For RuStore In-app updates SDK to operate correctly, the following conditions need to be met:

  • Android 7.0 or later
  • RuStore app version on the device is up-to-date
  • User is authorized in RuStore
  • RuStore app is allowed to install applications

Connecting to project

To get started, download RuStore AppUpdate SDK and import it in the project (Assets > Import Package > Custom Package). Dependencies are included automatically using the External Dependency Manager (included in the SDK).

Minimum API level level must be set to at least 24.. Application minification (ProGuard/R8) is not currently supported; it must be disabled in the project settings (File > Build Settings > Player Settings > Publishing Settings > Minify).

Create update manager

Create update manager before calling library methods.

RuStoreAppUpdateManager.Instance.Init();

Check for updates

Before requesting an update, check if it is available for your application To check for updates, call the getAppUpdateInfo() method. When this method is called, the following conditions will be verified:

  • The current version of RuStore is installed on the user's device.
  • The user and the app are not banned in RuStore.
  • RuStore app is allowed to install applications.
  • User is authorized in RuStore.

Upon calling this method, the AppUpdateInfo object will be returned which contains information regarding any required updates. It is recommended to request and cache this object in advance, ensuring a prompt and convenient update download process for the user.

RuStoreAppUpdateManager.Instance.GetAppUpdateInfo(onFailure: (error) => {
// Handle error
},
onSuccess: (info) => {
// Process update info
})
The AppUpdateInfo object contains a set of parameters needed to determine if an update is available:
  • updateAvailability — update availability:

    :

    • UNKNOWN (int == 0) — by default.;
    • UPDATE_NOT_AVAILABLE (int == 1) — no update required.;
    • UPDATE_AVAILABLE (int == 2) — update needs to be downloaded or it has already been downloaded to the user's device.;
    • DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS (int == 3) — update is already being downloaded or installation is already running..
  • installStatus— update installation status, if the user has already started the update installation at the time:

    :

    • UNKNOWN (int == 0) — by default.;
    • DOWNLOADED (int == 1) — successfully downloaded.;
    • DOWNLOADING (int == 2) — currently being downloaded.;
    • FAILED (int == 3) — error.;
    • PENDING (int == 5) — awaiting update..
info

The update download is only available if the updateAvailability field has the UPDATE_AVAILABLE value.

Download and install updates

Using listener

Once AppUpdateInfo is received, you can check whether a push update is available.

Check update status

Use RegisterListener().

RuStoreAppUpdateManager.Instance.RegisterListener(listener);

listener — object of a class that implements IInstallStateUpdateListener.

UpdateListener
public interface IInstallStateUpdateListener {
public void OnStateUpdated(InstallState state);
}

The state object describes the current download status. The object content is below

  • installStatus— update installation status, if the user has already started the update installation at the time:

    :

    • UNKNOWN (int == 0) — by default.;
    • DOWNLOADED (int == 1) — successfully downloaded.;
    • DOWNLOADING (int == 2) — currently being downloaded.;
    • FAILED (int == 3) — error.;
    • PENDING (int == 5) — awaiting update.;
  • bytesDownloaded — number of bytes downloaded.

    ;

  • totalBytesToDownload — total number of bytes that need to be downloaded.

    ;

  • installErrorCode— error code during download. Error structure is described in Error Handling.

Delete listener

If you no longer need a listener, use the unregisterListener() method to remove a listener, passing a previously registered listener to the method.

RuStoreAppUpdateManager.Instance.UnregisterListener(listener);

Start downloading update

Delayed update

Running an upgrade script

Update with RuStore UI

img
  1. To confirm the update, the user is presented with a RuStore UI dialogue.
  2. When you click the Update button, a dialogue box will appear to confirm that the update has been installed.
  3. If the update is successfully installed, the application will be closed.

Running an upgrade script

To start the download, use the StartUpdateFlow() method.

info

It's important to note that the AppUpdateInfo object becomes obsolete after a single use. To call the StartUpdateFlow() method again, request AppUpdateInfo, again using the GetAppUpdateInfo() method.

RuStoreAppUpdateManager.Instance.StartUpdateFlow(
onFailure: (error) => {
// Handle error
},
onSuccess: (resultCode) => {
// Handle flow result
});

If the user confirmed downloading the update, resultCode = UpdateFlowResult.RESULT_OK, if refused, resultCode = UpdateFlowResult.RESULT_CANCELED.

Once the InstallStatus.DOWNLOADED status is received, you can proceed to invoke the update installation method within the listener (CompleteUpdate()).

It is advisable to notify the user that the update is prepared for installation at this point.

This method may return an error.

Update installation

After downloading the APK update file, you can start the update installation. To start the installation, use the CompleteUpdate() method.

RuStoreAppUpdateManager.Instance.CompleteUpdate(
onFailure: (error) => {
// Handle error
});

The update is carried out through the native android tool. If the update is successfully installed, the application will be closed.

Errors processing

tip

It is not recommended to display the error to the user yourself if you get onFailure in response. It can negatively affect the user experience.

Below is the error pattern:

public class RuStoreError {
public string name;
public string description;
}

Possible errors

  • RuStoreNotInstalledException — RuStore is not installed on the user's device;
  • RuStoreOutdatedException — RuStore version installed on the user's device does not support this SDK;
  • RuStoreUserUnauthorizedException — user is not authorized in RuStore;
  • RuStoreException — basic RuStore error from which other errors are inherited;
  • RuStoreInstallException(public val code: Int) — download and installation error.
    • ERROR_UNKNOWN(Int = 4001) — unknown error.
    • ERROR_DOWNLOAD(Int = 4002) — error while downloading.
    • ERROR_BLOCKED(Int = 4003) — installation blocked by system.
    • ERROR_INVALID_APK(Int = 4004) — invalid update APK.
    • ERROR_CONFLICT(Int = 4005) — conflict with the current app version.
    • ERROR_STORAGE(Int = 4006) — insufficient device storage.
    • ERROR_INCOMPATIBLE(Int = 4007) — incompatible with device.
    • ERROR_APP_NOT_OWNED(Int = 4008) — application not purchased.
    • ERROR_INTERNAL_ERROR(Int = 4009) — internal error.
    • ERROR_ABORTED(Int = 4010) — user refused to install the update.
    • ERROR_APK_NOT_FOUND(Int = 4011) — APK for installation not found.
    • ERROR_EXTERNAL_SOURCE_DENIED(Int = 4012) — update prohibited. For example, the first method responses that an update is not available, but the user calls the second method.
    • ERROR_ACTIVITY_SEND_INTENT(Int = 9901) — error while sending intent for opening an activity.
    • ERROR_ACTIVITY_UNKNOWN(Int = 9902) — unknown error on activity opening.

List of dependencies for app update

  • ru.rustore.sdk:core:0.1.10 — GNU Lesser General Public License v3.0;
  • ru.rustore.sdk:analytics:0.1.5 — GNU Lesser General Public License v3.0;
  • org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 — The Apache Software License, Version 2.0;
  • org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 — The Apache Software License, Version 2.0;
  • androidx.core:core-ktx:1.9.0 — The Apache Software License, Version 2.0;
  • androidx.appcompat:appcompat:1.5.1 — The Apache Software License, Version 2.0;
  • androidx.activity:activity:1.5.1 — The Apache Software License, Version 2.0.