2.0.0
Общие сведения
RuStore In-app updates SDK поддерживает актуальную версию приложения на устройстве пользователя. Это помогает пользователю увидеть обновления, оценить улучшение производительности и результат исправления ошибок.
Пример пользовательского сценария
Используйте RuStore In-app updates SDK для реализации различных способов обновлений. В настоящий момент поддерживаются: отложенное, тихое (без UI от RuStore) и принудительное обновление.
- Kotlin
- Java
Ознакомьтесь с приложением-примером чтобы узнать, как правильно интегрировать SDK обновлений.
Ознакомьтесь с приложением-примером чтобы узнать, как правильно интегрировать SDK обновлений.
Условия корректной работы SDK
Для работы RuStore In-app updates SDK необходимо соблюдение следующих условий.
- Kotlin
- Java
- Приложение загружено в Консоль RuStore.
- Приложение прошло модерацию (публиковать приложение необязательно).
- Подпись тестируемой сборки (например,
debug
) приложения должна совпадать с подписью сборки приложения, которая была загружена в консоль и прошла модерацию ранее (например,release
).
- ОС Android версии 7.0 или выше.
- Версия RuStore на устройстве пользователя актуальная.
- Пользователь авторизован в RuStore.
- Приложению RuStore разрешена установка приложений.
- Приложение загружено в Консоль RuStore.
- Приложение прошло модерацию (публиковать приложение необязательно).
- Подпись тестируемой сборки (например,
debug
) приложения должна совпадать с подписью сборки приложения, которая была загружена в консоль и прошла модерацию ранее (например,release
).
- ОС Android версии 7.0 или выше.
- Версия RuStore на устройстве пользователя актуальная.
- Пользователь авторизован в RuStore.
- Приложению RuStore разрешена установка приложений.
Подключение в проект
- Kotlin
- Java
Подключите репозиторий.
repositories {
maven {
url = uri("https://artifactory-external.vkpartner.ru/artifactory/maven")
}
}
Чтобы подключить зависимости SDK необходимо добавить следующий фрагмент кода в свой конфигурационный файл.
dependencies {
implementation("ru.rustore.sdk:appupdate:2.0.0")
}
Подключите репозиторий.
repositories {
maven {
url "https://artifactory-external.vkpartner.ru/artifactory/maven"
}
}
Чтобы подключить зависимости SDK необходимо добавить следующий фрагмент кода в свой конфигурационный файл.
dependencies {
implementation "ru.rustore.sdk:appupdate:2.0.0"
}
Создание менеджера обновлений
- Kotlin
- Java
Перед вызовом методов библиотеки необходимо создать менеджер обновлений.
val updateManager = RuStoreAppUpdateManagerFactory.create(context)
Перед вызовом методов библиотеки необходимо создать менеджер обновлений.
RuStoreAppUpdateManager ruStoreAppUpdateManager = RuStoreAppUpdateManagerFactory.INSTANCE.create(context);
Проверка наличия обновлений
- Kotlin
- Java
getAppUpdateInfo()
. При вызове данного метода проверяются следующие условия.
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- Приложению RuStore разрешена установка приложений.
- Пользователь авторизован в RuStore.
AppUpdateInfo
, который будет содержать в себе информацию о необходимости обновления. Запросите этот объект заранее и закэшируйте его, чтобы запросить у пользователя запуск скачивания обновления без задержки и в удобный для пользователя момент времени.
ruStoreAppUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability == UpdateAvailability.UPDATE_AVAILABLE) {
// Обновление доступно(здесь можно зарегистрировать listener и начать загрузку)
}
}
.addOnFailureListener { throwable ->
Log.e(TAG, "getAppUpdateInfo error", throwable)
}
AppUpdateInfo
содержит набор параметров, необходимых для определения доступности обновления.
-
updateAvailability
— доступность обновления:UNKNOWN (int == 0)
— по умолчанию;UPDATE_NOT_AVAILABLE (int == 1)
— обновление не нужно;UPDATE_AVAILABLE (int == 2)
— обновление требуется загрузить или обновление уже загружено на устройство пользователя;DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS (int == 3)
— обновление уже скачивается или установка уже запущена.
-
installStatus
— статус установки обновления, если пользователь уже устанавливает обновление в текущий момент времени:UNKNOWN (int == 0)
— по умолчанию;DOWNLOADED (int == 1)
— скачано;DOWNLOADING (int == 2)
— скачивается;FAILED (int == 3)
— ошибка;PENDING (int == 5)
— в ожидании.
Запуск скачивания обновления возможен только в том случае, если поле updateAvailability
содержит значение UPDATE_AVAILABLE
.
getAppUpdateInfo()
. При вызове данного метода проверяются следующие условия.
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- Приложению RuStore разрешена установка приложений.
- Пользователь авторизован в RuStore.
AppUpdateInfo
, который будет содержать в себе информацию о необходимости обновления. Запросите этот объект заранее и закэшируйте его, чтобы запросить у пользователя запуск скачивания обновления без задержки и в удобный для пользователя момент времени.
ruStoreAppUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.getUpdateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
// Обновление доступно(здесь можно зарегистрировать listener и начать загрузку)
}
})
.addOnFailureListener(throwable ->
Log.e(TAG, "getAppUpdateInfo error", throwable)
);
AppUpdateInfo
содержит набор параметров, необходимых для определения доступности обновления.
-
updateAvailability
— доступность обновления:UNKNOWN (int == 0)
— по умолчанию;UPDATE_NOT_AVAILABLE (int == 1)
— обновление не нужно;UPDATE_AVAILABLE (int == 2)
— обновление требуется загрузить или обновление уже загружено на устройство пользователя;DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS (int == 3)
— обновление уже скачивается или установка уже запущена.
-
installStatus
— статус установки обновления, если пользователь уже устанавливает обновление в текущий момент времени:UNKNOWN (int == 0)
— по умолчанию;DOWNLOADED (int == 1)
— скачано;DOWNLOADING (int == 2)
— скачивается;FAILED (int == 3)
— ошибка;PENDING (int == 5)
— в ожидании.
Запуск скачивания обновления возможен только в том случае, если поле updateAvailability
содержит значение UPDATE_AVAILABLE
.
Скачивание и установка обновлений
Использование слушателя
После подтверждения доступности обновления (AppUpdateInfo
) вы можете запросить статус скачивания обновления — для этого запустите слушатель статуса скачивания обновления.
Проверка статуса скачивания обновления
- Kotlin
- Java
Используйте метод registerListener()
.
ruStoreAppUpdateManager.registerListener { state ->
when (state.installStatus) {
InstallStatus.DOWNLOADED -> {
// Обновление готово к установке
}
InstallStatus.DOWNLOADING -> {
val totalBytes = state.totalBytesToDownload
val bytesDownloaded = state.bytesDownloaded
// Здесь можно отобразить прогресс скачивания
}
InstallStatus.FAILED -> {
Log.e(TAG, "Downloading error")
}
}
}
Объект state
описывает текущий статус скачивания. Ниже представлено содержимое объекта.
-
installStatus
— статус установки обновления, если пользователь уже устанавливает обновление в текущий момент времени:UNKNOWN (int == 0)
— по умолчанию;DOWNLOADED (int == 1)
— скачано;DOWNLOADING (int == 2)
— скачивается;FAILED (int == 3)
— ошибка;PENDING (int == 5)
— в ожидании;
В SDK обновлений нет особого статуса для ситуации, когда пользователь отменил скачивание обновления. Если пользователь прервал обновление на этапе скачивания, installStatus
возвращает исходный статус UNKNOWN
(0
) с кнопкой Скачать.
Если пользователь уже скачал обновление, но отменил установку, то installStatus
вернёт значение DOWNLOADED
(1
).
Рассмотрим следующие варианты.
- Пользователь начал скачивание обновления, но отменил скачивание — в этом случае:
updateAvailability
—UPDATE_AVAILABLE
(2
);installStatus
—UNKNOWN
(0
).
- Пользователь скачал файл обновления, но не стал его устанавливать — в этом случае:
updateAvailability
—UPDATE_AVAILABLE
(2
);installStatus
—DOWNLOADED
(1
).
bytesDownloaded
— количество загруженных байт;totalBytesToDownload
— общее количество байт, которое необходимо скачать;installErrorCode
— код ошибки во время скачивания. Коды ошибок описаны в разделе Обработка ошибок.
Используйте метод registerListener()
.
ruStoreAppUpdateManager.registerListener(state -> {
switch (state.getInstallStatus()) {
case InstallStatus.DOWNLOADED:
// Обновление готово к установке
break;
case InstallStatus.DOWNLOADING:
long totalBytes = installState.getTotalBytesToDownload();
long bytesDownloaded = installState.getBytesDownloaded();
// Здесь можно отобразить прогресс скачивания
break;
case InstallStatus.FAILED:
Log.e(TAG, "Downloading error");
break;
}
});
Объект state
описывает текущий статус скачивания. Ниже представлено содержимое объекта.
-
installStatus
— статус установки обновления, если пользователь уже устанавливает обновление в текущий момент времени:UNKNOWN (int == 0)
— по умолчанию;DOWNLOADED (int == 1)
— скачано;DOWNLOADING (int == 2)
— скачивается;FAILED (int == 3)
— ошибка;PENDING (int == 5)
— в ожидании;
В SDK обновлений нет особого статуса для ситуации, когда пользователь отменил скачивание обновления. Если пользователь прервал обновление на этапе скачивания, installStatus
возвращает исходный статус UNKNOWN
(0
) с кнопкой Скачать.
Если пользователь уже скачал обновление, но отменил установку, то installStatus
вернёт значение DOWNLOADED
(1
).
Рассмотрим следующие варианты.
- Пользователь начал скачивание обновления, но отменил скачивание — в этом случае:
updateAvailability
—UPDATE_AVAILABLE
(2
);installStatus
—UNKNOWN
(0
).
- Пользователь скачал файл обновления, но не стал его устанавливать — в этом случае:
updateAvailability
—UPDATE_AVAILABLE
(2
);installStatus
—DOWNLOADED
(1
).
bytesDownloaded
— количество загруженных байт;totalBytesToDownload
— общее количество байт, которое необходимо скачать;installErrorCode
— код ошибки во время скачивания. Коды ошибок описаны в разделе Обработка ошибок.
Удаление слушателя
- Kotlin
- Java
Если необходимости в слушателе больше нет, воспользуйтесь методом удаления слушателя unregisterListener()
, передав в метод ранее зарегистрированный слушатель.
ruStoreAppUpdateManager.unregisterListener(listener)
Если необходимости в слушателе больше нет, воспользуйтесь методом удаления слушателя unregisterListener()
, передав в метод ранее зарегистрированный слушатель.
ruStoreAppUpdateManager.unregisterListener(listener);
Запуск скачивания обновления
Отложенное обновление
Описание сценария отложенного обновления
Обновление с UI от RuStore
- Пользователю будет показан диалог с UI от RuStore для подтверждения обновления.
- При нажатии на кнопку Обновить покажется диалоговое окно для подтверждения установки обновления.
- После завершения установки приложение закроется.
- Kotlin
- Java
Запуск сценария обновления
Для запуска скачивания обновления приложения вызовите метод startUpdateFlow()
.
Объект AppUpdateInfo
после однократного использования становится невалидным. Для повторного вызова метода startUpdateFlow()
запросите AppUpdateInfo
, снова используя метод getAppUpdateInfo()
.
ruStoreAppUpdateManager
.startUpdateFlow(appUpdateInfo, AppUpdateOptions.Builder().build())
.addOnSuccessListener { resultCode ->
if (resultCode == Activity.RESULT_CANCELED) {
// Пользователь отказался от скачивания
}
}
.addOnFailureListener { throwable ->
Log.e(TAG, "startUpdateFlow error", throwable)
}
Если пользователь подтвердил скачивание обновления, тогда resultCode = Activity.RESULT_OK
, если отказался, то resultCode = Activity.RESULT_CANCEL
.
После получения статуса DOWNLOADED
вы можете вызвать метод установки обновления completeUpdate().
Рекомендуется уведомить пользователя о готовности обновления к установке.
Метод может вернуть ошибку.
Запуск сценария обновления
Для запуска скачивания обновления приложения вызовите метод startUpdateFlow()
.
Объект AppUpdateInfo
после однократного использования становится невалидным. Для повторного вызова метода startUpdateFlow()
запросите AppUpdateInfo
, снова используя метод getAppUpdateInfo()
.
ruStoreAppUpdateManager
.startUpdateFlow(appUpdateInfo, new AppUpdateOptions.Builder().build())
.addOnSuccessListener(resultCode -> {
if (resultCode == Activity.RESULT_CANCELED) {
// Пользователь отказался от скачивания
}
})
.addOnFailureListener(throwable ->
Log.e(TAG, "startUpdateFlow error", throwable)
);
Если пользователь подтвердил скачивание обновления, тогда resultCode = Activity.RESULT_OK
, если отказался, то resultCode = Activity.RESULT_CANCEL
.
После получения статуса DOWNLOADED
вы можете вызвать метод установки обновления completeUpdate().
Рекомендуется уведомить пользователя о готовности обновления к установке.
Метод может вернуть ошибку.
Принудительное обновление
Описание сценария принудительного обновления
Обновление с UI от RuStore
- Пользователю будет показан полноэкранный диалог с UI от RuStore для подтверждения обновления. Использование приложения будет заблокировано до тех пор, пока обновление не будет установлено.
- При нажатии на кнопку Обновить отобразится диалоговое окно для подтверждения установки обновления.
- Далее при нажатии на кнопку Установить появится полноэкранный диалог об установке новой версии приложения.
- После завершения установки приложение перезапустится.
Приложение будет перезапущено, если версия Rustore больше, либо равна 1.37. Если версия Rustore ниже, то приложение закроется для установки обновления и не будет открыто заново, когда закончится обновление.
- Kotlin
- Java
Запуск сценария обновления
После получения AppUpdateInfo
вы можете проверить доступность принудительного обновления.
if (appUpdateInfo.isUpdateTypeAllowed(IMMEDIATE)) {
// Принудительное обновление доступно
}
Результат функции isUpdateTypeAllowed
рекомендуется использовать для принятия решения о запуске принудительного обновления, но данный результат не влияет на возможность запуска сценария. Необходимость запуска сценария обновления может происходить по вашей внутренней логике.
Для запуска сценария обновления используйте метод startUpdateFlow()
.
ruStoreAppUpdateManager
.startUpdateFlow(appUpdateInfo, AppUpdateOptions.Builder().appUpdateType(IMMEDIATE).build())
.addOnSuccessListener { resultCode ->
}
.addOnFailureListener { throwable ->
}
resultCode (Int)
:
Activity.RESULT_OK (-1)
— обновление выполнено, код может не быть получен, т. к. приложение в момент обновления завершается.Activity.RESULT_CANCELED (0)
— флоу прервано пользователем, или произошла ошибка. Предполагается, что при получении этого кода следует завершить работу приложения.ActivityResult.ACTIVITY_NOT_FOUND (2)
— RuStore не установлен, либо установлена версия, которая не поддерживает принудительное обновление (RuStore versionCode
<191
).
throwable
— ошибка старта сценария обновления.
При успешном обновлении дальнейших действий не требуется.
Запуск сценария обновления
После получения AppUpdateInfo
вы можете проверить доступность принудительного обновления.
if (appUpdateInfo.isUpdateTypeAllowed(IMMEDIATE)) {
// Принудительное обновление доступно
}
Результат функции isUpdateTypeAllowed
рекомендуется использовать для принятия решения о запуске принудительного обновления, но данный результат не влияет на возможность запуска сценария. Необходимость запуска сценария обновления может происходить по вашей внутренней логике.
Для запуска сценария обновления используйте м етод startUpdateFlow()
.
ruStoreAppUpdateManager
.startUpdateFlow(appUpdateInfo, new AppUpdateOptions.Builder().appUpdateType(AppUpdateType.IMMEDIATE).build()
.addOnSuccessListener(resultCode ->
)
.addOnFailureListener(throwable ->
);
resultCode (Int)
:
Activity.RESULT_OK (-1)
— обновление выполнено, код может не быть получен, т. к. приложение в момент обновления завершается.Activity.RESULT_CANCELED (0)
— флоу прервано пользователем, или произошла ошибка. Предполагается, что при получении этого кода следует завершить работу приложения.ActivityResult.ACTIVITY_NOT_FOUND (2)
— RuStore не установлен, либо установлена версия, которая не поддерживает принудительное обновление (RuStore versionCode
<191
).
throwable
— ошибка старта сценария обновления.
При успешном обновлении дальнейших действий не требуется.