Giter Site home page Giter Site logo

flutter-rustore-update's Introduction

flutter_rustore_update

Общее

RuStore In-app updates SDK помогает поддерживать актуальную версию вашего приложения на устройстве пользователя.

Когда пользователи поддерживают приложение в актуальном состоянии, они могут опробовать новые функции, а также воспользоваться улучшениями производительности и исправлениями ошибок.

Вы можете использовать RuStore In-app updates SDK для отображения процесса обновления приложения, который обеспечивает фоновую загрузку и установку обновления с контролем состояния. Пользователь сможет использовать ваше приложение в момент загрузки обновления.

Пример пользовательского сценария

Update flow

Условия корректной работы 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: ^6.1.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 - Запуск обновления запрещён. Например, в первом методе вернулся ответ о том, что обновление недоступно, но пользователь вызывает второй метод.

flutter-rustore-update's People

Contributors

evgeniydudin9045 avatar max19-8 avatar

Stargazers

 avatar  avatar

flutter-rustore-update's Issues

Не запускается listener в flutter_rustore_update

День добрый.

Попробовал использовать для своего проекта flutter_rustore_update. Но у меня возникла проблема в виде ошибки:

I/flutter ( 7000): Update available: 2
I/flutter ( 7000): Start listener
I/flutter ( 7000): RustoreUpdateClient.silent
D/FlutterRustoreUpdate( 7000): ru.rustore.sdk.appupdate.errors.RuStoreInstallException: app update error
I/flutter ( 7000): silent err PlatformException(ru.rustore.sdk.appupdate.errors.RuStoreInstallException: app update error, RuStoreInstallException, Cause: null, Stacktrace: ru.rustore.sdk.appupdate.errors.RuStoreInstallException: app update error
I/flutter ( 7000): at ru.rustore.sdk.appupdate.errors.RemoteProviderErrors.toRuStoreException(Unknown Source:23)
I/flutter ( 7000): at ru.rustore.sdk.appupdate.c0$a.a(SourceFile:2)
I/flutter ( 7000): at ru.rustore.sdk.appupdate.d0$a.onTransact(Unknown Source:36)
I/flutter ( 7000): at android.os.Binder.execTransactInternal(Binder.java:1339)
I/flutter ( 7000): at android.os.Binder.execTransact(Binder.java:1275)
I/flutter ( 7000): , null)

Как я понял, не стартует 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()
}
});

не выполняется - в окне отладки не видно соответвующих строк print. При этом не возникает ни какой ошибки и код (RustoreUpdateClient.listener...) просто игнорируется.
Тестирую на эмуляторе. Использовал код в примере https://gitflic.ru/project/rustore/flutter-rustore-update/blob?file=example%2Flib%2Fmain.dart&branch=master
В чем может быть проблема?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.