flutter_rustore_update
Документация RuStore
- flutter_rustore_update
Общее
RuStore In-app updates SDK помогает поддерживать актуальную версию вашего приложения на устройстве пользователя.
Когда пользователи поддерживают приложение в актуальном состоянии, они могут опробовать новые функции, а также воспользоваться улучшениями производительности и исправлениями ошибок.
Вы можете использовать RuStore In-app updates SDK для отображения процесса обновления приложения, который обеспечивает фоновую загрузку и установку обновления с контролем состояния. Пользователь сможет использовать ваше приложение в момент загрузки обновления.
Пример пользовательского сценария
Подготовка требуемых параметров
Для запуска примера, вам нужны следующие параметры:
-
applicationId
- - из приложения, которое вы публиковали в консоль RuStore, находится в файле build.gradle вашего проектаandroid { defaultConfig { applicationId = "ru.rustore.sdk.updateexample" } }
-
release.keystore
- подпись, которой было подписано приложение, опубликованное в консоль RuStore.
Настройка примера приложения
- Для проверки работы примера вам надо загрузить в консоль 2 версси приложения, с разным versionCode. И в тестировании указать меньший versionCode, нежели есть в консоли.
defaultConfig {
versionCode 1
}
- Замените
applicationId
в файле example/android/app/build.gradle, на applicationId apk-файла, который вы публиковали в консоль RuStore:
android {
defaultConfig {
applicationId = "ru.rustore.sdk.updateexample" // Зачастую в buildTypes приписывается .debug
}
}
- Замените подпись на подпись вашего приложения. Настройте параметры
key_alias
,key_password
,store_password
android{
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
}
Условия корректной работы SDK
Для работы RuStore In-app updates SDK необходимо соблюдение следующих условий:
- ОС Android версии 7.0 или выше.
- На устройстве пользователя должен быть установлен RuStore.
- Версия RuStoreApp на устройстве пользователя должна быть актуальной.
- Приложению RuStore должна быть разрешена установка приложений.
Пример реализации
Для того, чтобы узнать как правильно интегрировать пакет для работы с push-уведомлениями, рекомендуется ознакомиться с приложением-примером
https://gitflic.ru/project/rustore/flutter-rustore-update
Подключение в проект
Для подключения пакета к проекту нужно выполнить команду
flutter pub add flutter_rustore_update
Эта команда добавит строчку в файл pubspec.yaml
dependencies:
flutter_rustore_update: ^7.0.0
Проверка наличия обновлений
Прежде чем запрашивать обновление, проверьте, доступно ли обновление для вашего приложения. Для проверки наличия обновлений вызовите метод info(). При вызове данного метода проверяются следующие условия:
- На устройстве пользователя должен быть установлен RuStore.
- Версия RuStoreApp на устройстве пользователя должна быть актуальной.
- Пользователь и приложение не должны быть заблокированы в RuStore.
В ответ на данный метод вы получите объект info, который будет содержать в себе информацию о необходимости обновления.
RustoreUpdateClient.info().then((info) {
print(info);
}).catchError((err) {
print(err);
});
Объект info содержит набор параметров, необходимых для определения доступности обновления:
-
updateAvailability - доступность обновления:
-
UPDATE_AILABILITY_NOT_AVAILABLE - обновление не нужно.
- UPDATE_AILABILITY_AVAILABLE - обновление требуется загрузить или обновление уже загружено на устройство пользователя.
- UPDATE_AILABILITY_IN_PROGRESS - обновление уже скачивается или установка уже запущена.
-
UPDATE_AILABILITY_UNKNOWN - статус по умолчанию.
-
installStatus - статус установки обновления, если пользователь уже устанавливает обновление в текущий момент времени:
-
INSTALL_STATUS_DOWNLOADED - скачано.
- INSTALL_STATUS_DOWNLOADING - скачивается.
- INSTALL_STATUS_FAILED - ошибка.
- INSTALL_STATUS_INSTALLING - устанавливается.
- INSTALL_STATUS_PENDING - в ожидании.
- INSTALL_STATUS_UNKNOWN - по умолчанию.
Запуск скачивания обновления возможен только в том случае, если поле updateAvailability содержит значение UPDATE_AILABILITY_AVAILABLE.
Метод может вернуть ошибку, детально со списком ошибок можно ознакомиться в разделе *Возможные ошибки.
Скачивание обновления
После подтверждения доступности обновления вы можете запросить у пользователя скачивание обновления, но перед этим необходимо запустить слушатель статуса скачивания обновления, используя метод listener()
RustoreUpdateClient.listener((value) {
print("listener installStatus ${value.installStatus}");
print("listener bytesDownloaded ${value.bytesDownloaded}");
print("listener totalBytesToDownload ${value.totalBytesToDownload}");
print("listener installErrorCode ${value.installErrorCode}");
if (value.installStatus == INSTALL_STATUS_DOWNLOADED) {
// тут можно вызывать метод complete()
}
});
Объект state описывает текущий статус скачивания обновления. Объект содержит:
-
installStatus - статус установки обновления, если пользователь уже устанавливает обновление в текущий момент времени:
-
INSTALL_STATUS_DOWNLOADED - скачано.
-
INSTALL_STATUS_DOWNLOADING - скачивается.
- INSTALL_STATUS_FAILED - ошибка.
- INSTALL_STATUS_INSTALLING - устанавливается.
- INSTALL_STATUS_PENDING - в ожидании.
-
INSTALL_STATUS_UNKNOWN - по умолчанию.
-
bytesDownloaded - количество загруженных байт.
-
totalBytesToDownload - общее количество байт, которое необходимо скачать.
- installErrorCode - код ошибки во время скачивания. Детальнее с возможными ошибками можно ознакомиться в разделе Возможные ошибки.
Отложенное обновление
Скачивание с UI от RuStore
Для запуска скачивания обновления приложения вызовите метод download().
RustoreUpdateClient.download().then((value) {
print("download code ${value.code}");
}).catchError((err) {
print("download err ${err}");
});
Если пользователь подтвердил скачивание обновления, то value.code = ACTIVITY_RESULT_OK, если отказался, то value.code = ACTIVITY_RESULT_CANCELED.
После вызова метода вы можете следить за статусом скачивания обновления в слушателе. Если в слушателе вы получили статус INSTALL_STATUS_DOWNLOADED, то вы можете вызвать метод установки обновления complete(). Рекомендуем уведомить пользователя о готовности установки обновления.
Метод может вернуть ошибку. Детальнее со списком ошибок можно ознакомиться в разделе Возможные ошибки.
Принудительное обновление
Скачивание с UI от RuStore
Для запуска скачивания принудительного обновления приложения вызовите метод immediate()
.
RustoreUpdateClient.immediate().then((value) {
print("silent code ${value.code}");
}).catchError((err) {
print("immediate err ${err}");
});
resultCode (Int)
:
ACTIVITY_RESULT_OK (-1)
— обновление выполнено, код может не быть получен, т. к. приложение в момент обновления завершается.ACTIVITY_RESULT_CANCELED (0)
— флоу прервано пользователем, или произошла ошибка. Предполагается, что при получении этого кода следует завершить работу приложения.ACTIVITY_RESULT_NOT_FOUND (2)
— RuStore не установлен, либо установлена версия, которая не поддерживает принудительное обновление (RuStore versionCode
<191
).
throwable
— ошибка старта сценария обновления.
При успешном обновлении дальнейших действий не требуется.
Тихое обновление
Скачивание без UI от RuStore
Для данного типа обновления рекомендуется реализовать свой интерфейс.
Для запуска скачивания тихого обновления приложения вызовите метод silent()
.
RustoreUpdateClient.silent().then((value) {
print("silent code ${value.code}");
}).catchError((err) {
print("silent err ${err}");
});
При вызове then
с code = ACTIVITY_RESULT_OK
будет зарегистрирована задача на скачивание обновления.
В данном сценарии может быть вызван только then
с ACTIVITY_RESULT_OK
, либо catchError
.
После вызова метода вы можете следить за статусом скачивания обновления в слушателе.
После получения статуса INSTALL_STATUS_DOWNLOADED
вы можете вызвать метод установки обновления. Рекомендуется уведомить пользователя о готовности обновления к установке.
Установка обновления
Гибкое завершение обновления
Обновление с UI от RuStore:
После завершения скачивания apk-файла обновления вы можете запустить установку обновления. Для запуска установки обновления вызовите метод completeUpdateFlexible().
RustoreUpdateClient.completeUpdateFlexible().catchError((err) {
print("completeUpdateFlexible err ${err}");
});
1.Пользователю будет показан UI-диалог завершения обновления.
2.В случае успешного обновления приложение будет перезапущено.
Обновление происходит через нативный инструмент android. В случае успешного обновления приложение перезапустится.
Тихое завершение обновления
Обновление без UI от RuStore:
После завершения скачивания apk-файла обновления вы можете запустить установку обновления. Для запуска установки обновления вызовите метод completeUpdateSilent().
RustoreUpdateClient.completeUpdateSilent().catchError((err) {
print("completeUpdateSilent err ${err}");
});
1.UI-диалог завершения обновления не будет показан.
2.В случае успешного обновления приложение будет закрыто.
Обновление происходит через нативный инструмент android. В случае успешного обновления приложение будет закрыто.
На этапе обновления могут возникнуть ошибки. Детальнее с ними можно ознакомиться в разделе Возможные ошибки.
Возможные ошибки
Если вы получили в ответ onFailure, то не рекомендуем самостоятельно отображать ошибку пользователю. Отображение ошибки может негативно повлиять на пользовательский опыт.
Список возможных ошибок:
- UPDATE_ERROR_DOWNLOAD - Ошибка при скачивании.
- UPDATE_ERROR_BLOCKED - Установка заблокированна системой.
- UPDATE_ERROR_INVALID_APK - Некорректный APK обновления.
- UPDATE_ERROR_CONFLICT - Конфликт с текущей версией приложения.
- UPDATE_ERROR_STORAGE - Недостаточно памяти на устройстве.
- UPDATE_ERROR_INCOMPATIBLE - Несовместимо с устройством.
- UPDATE_ERROR_APP_NOT_OWNED - Приложение не куплено.
- UPDATE_ERROR_INTERNAL_ERROR - Внутренняя ошибка.
- UPDATE_ERROR_ABORTED - Пользователь отказался от установки обновления.
- UPDATE_ERROR_APK_NOT_FOUND - apk для запуска установки не найден.
- UPDATE_ERROR_EXTERNAL_SOURCE_DENIED - Запуск обновления запрещён. Например, в первом методе вернулся ответ о том, что обновление недоступно, но пользователь вызывает второй метод.