6.0.0
Общие сведения
RuStore In-app updates SDK поддерживает актуальную версию приложения на устройстве пользователя. Это помогает пользователю увид еть обновления, оценить улучшение производительности и результат исправления ошибок.
Пример реализации
Используйте RuStore In-app updates SDK для реализации различных способов обновлений. В настоящий момент поддерживаются: отложенное, тихое (без UI от RuStore) и принудительное обновление.
Ознакомьтесь с приложением-примером чтобы узнать, как правильно интегрировать SDK обновлений.
Пользовательские сценарии
- Отложенное обновление
- Принудительное обновление
- Тихое обновление
Условия корректной работы SDK
Для работы RuStore In-app updates SDK необходимо соблюдение следующих условий.
- Приложение загружено в Консоль RuStore.
- Приложение прошло модерацию (публиковать приложение необязательно).
- Подпись тестируемой сборки (например,
debug
) приложения должна совпадать с подписью сборки приложени я, которая была загружена в консоль и прошла модерацию ранее (например,release
).
- ОС Android версии 7.0 или выше.
- Версия RuStore на устройстве пользователя актуальная.
- Пользователь авторизован в RuStore.
- Приложению RuStore разрешена установка приложений.
Подключение в проект
Для подключения пакета к проекту выполните следующую команду.
// HTTPS
npm install git+https://git@gitflic.ru/project/rustore/react-native-rustore-update-sdk.git
// SSH
npm install git+ssh://git@gitflic.ru/project/rustore/react-native-rustore-update-sdk.git
Создание менеджера обновлений
Для работы механизма обновлений необходимо выполнить инициализацию SDK
RustoreUpdateClient.init();
Проверка наличия обновлений
Прежде чем запрашивать обновление, проверьте, доступно ли обновление для вашего приложения. Для проверки наличия обновлений вызовите методgetAppUpdateInfo()
. При вызове данного метода проверяются следующие условия.
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- Приложению RuStore разрешена установка приложений.
- Пользователь авторизован в RuStore.
В ответ на данный метод вы получите объект appUpdateInfo
, который будет содержать в себе информацию о необходимости обновления.
try {
const appUpdateInfo = await RustoreUpdateClient.getAppUpdateInfo();
console.log(appUpdateInfo);
} catch (err) {
console.log(err);
}
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
) вы можете запросить статус скачивания обновления — для этого запустите слуш атель статуса скачивания обновления.
Проверка статуса скачивания обновления
Используйте метод eventEmitter.addListener
.
const listener = useRef<EmitterSubscription>();
listener.current = eventEmitter.addListener(Events.INSTALL_STATE_UPDATE, async (state: InstallState) => {
switch (state.installStatus) {
case InstallStatus.DOWNLOADED: {
// Обновление готово к установке
break;
}
case InstallStatus.DOWNLOADING: {
// Здесь можно отобразить прогресс скачивания
break;
}
case InstallStatus.FAILED: {
console.log(`Ошибка при загрузке: ${installState?.installErrorCode}`);
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
— код ошибки во время скачивания. Коды ошибок описаны в разделе Обработка ошибок.
Удаление слушателя
Если необходимости в слушателе больше нет, воспользуйтесь методом удаления слушателя remove()
.
listener.current?.remove();
Запуск скачивания обновления
Отложенное обновление
Запуск сценария обновления
Для запуска скачивания обновления приложения вызовите метод download()
.
Объект AppUpdateInfo
после однократного использования становится невалидным. Для повторного вызова метода download()
запросите AppUpdateInfo
, снова используя метод getAppUpdateInfo()
.
try {
const resultCode = await RustoreUpdateClient.download();
console.log(resultCode);
} catch (err) {
console.log(err);
}
Если пользователь подтвердил скачивание обновления, тогда resultCode = ResultCode.RESULT_OK
, если отказался, то resultCode = ResultCode.RESULT_CANCEL
.
После получения статуса InstallStatus.DOWNLOADED
вы можете вызвать метод установки обновления completeUpdate().
Рекомендуется уведомить пользователя о готовн ости обновления к установке.
Метод может вернуть ошибку.
Принудительное обновление
Запуск сценария обновления
Для запуска скачивания принудительного обновления приложения вызовите метод immediate()
.
try {
const resultCode = await RustoreUpdateClient.immediate();
console.log(resultCode);
} catch (err) {
console.log(err);
}
resultCode (Int)
:
ResultCode.RESULT_OK (-1)
— обновление выполнено, код может не быть получен, т. к. приложение в момент обновления завершается.ResultCode.RESULT_CANCELED (0)
— флоу прервано пользователем, или произошла ошибка. Предполагается, что при получении этого кода следует завершить работу приложения.ResultCode.ACTIVITY_NOT_FOUND (2)
— RuStore не установлен, либо установлена версия, которая не поддерживает принудительное обновление (RuStore versionCode
<191
).
throwable
— ошибка старта сценария обновления.
При успешном обновлении дальнейших действий не требуется.
Тихое обновление
Запуск сценария обновления
Для запуска скачивания тихого обновления приложения вызовите метод silent()
.
try {
const resultCode = await RustoreUpdateClient.silent();
console.log(resultCode);
} catch (err) {
console.log(err);
}
При выполнении блока try
с resultCode
= ResultCode.RESULT_OK
будет зарегистрирована задача на скачивание обновления.
В данном сценарии может быть вызван только блок try
с resultCode = ResultCode.RESULT_OK
, либо блок catch
.
После вызова метода вы можете следить за статусом скачивания обновления в слушателе.
После получения статуса InstallStatus.DOWNLOADED
вы можете вызвать метод установки обновления completeUpdate(). Рекомендуется уведомить пользователя о готовности обновления к установке.
Для тихого обновления рекомендуется реализовать свой интерфейс.
Установка обновления
После завершения скачивания APK-файла обновления вы можете запустить установку обновления. Для запуска установки обновления вызовите метод completeUpdate(type: number)
.
Сущность AppUpdateType
, откуда мы получаем тип обновления для установки. Допустимые типы обновлений для передачи в completeUpdate
метод FLEXIBLE
и SILENT
.
export enum AppUpdateType {
FLEXIBLE = 0,
IMMEDIATE = 1,
SILENT = 2,
}
try {
await RustoreUpdateClient.completeUpdate(AppUpdateType.FLEXIBLE);
} catch (err) {
console.log(err);
}
Если передать тип обновлений FLEXIBLE
, то приложение перезапустится. Пример флоу пользователя ниже.
Если передать тип обновлений SILENT
, то приложение закроется без перезапуска. Пример флоу пользователя ниже.
Обновление без UI от RuStore:
- UI-диалог завершения обновления не будет показан.
- В случае успешного обновления приложение будет закрыто.
Обработка ошибок
Если вы получили в ответ onFailure
, не рекомендуется самостоятельно отображать ошибку п ользователю. Отображение ошибки может негативно повлиять на пользовательский опыт.
Возможные ошибки
Все ошибки в плагине реализованы константами. Описание констант в файле types.ts
.
Список возможных ошибок.
RuStoreNotInstalledException
— на устройстве пользователя не установлен RuStore;RuStoreOutdatedException
— версия RuStore, установленная на устройстве пользователя, не поддерживает данный SDK;RuStoreUserUnauthorizedException
— пользователь не авторизован в RuStore;RuStoreException
— базовая ошибка RuStore, от которой наследуются остальные ошибки;RuStoreInstallException(public val code: Int)
— ошибка скачивания и установки.ERROR_UNKNOWN(Int = 4001)
— неизвестная ошибка.ERROR_DOWNLOAD(Int = 4002)
— ошибка при скачивании.ERROR_BLOCKED(Int = 4003)
— установка заблокированна системой.ERROR_INVALID_APK(Int = 4004)
— некорректный APK обновления.ERROR_CONFLICT(Int = 4005)
— конфликт с текущей версией приложения.ERROR_STORAGE(Int = 4006)
— недостаточно памяти на устройстве.ERROR_INCOMPATIBLE(Int = 4007)
— несовместимо с устройством.ERROR_APP_NOT_OWNED(Int = 4008)
— приложение не куплено.ERROR_INTERNAL_ERROR(Int = 4009)
— внутренняя ошибка.ERROR_ABORTED(Int = 4010)
— пользователь отказался от установки обновления.ERROR_APK_NOT_FOUND(Int = 4011)
— APK для запуска установки не найден.ERROR_EXTERNAL_SOURCE_DENIED(Int = 4012)
— запуск обновления запрещён. Например, в первом методе вернулся ответ о том, что обновление недоступно, но пользователь вызывает второй метод.ERROR_ACTIVITY_SEND_INTENT(Int = 9901)
— ошибка отправки intent на открытие активити.ERROR_ACTIVITY_UNKNOWN(Int = 9902)
— неизвестная ошибка отрытия активити.