SDK обновлений для Godot 3.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 разрешена установка приложений.
Подключение в проект
Для подключения выполните следующие шаги.
- Скопируйте проекты плагина из официального репозитория RuStore на GitFlic.
- Откройте в вашей IDE проект Android из папки
godot_plugin_libraries
. - Поместите в папку
godot_plugin_libraries/libs
пакетgodot-lib.xxx.yyy.template_release.aar
, гдеxxx.yyy
версия вашей редакции Godot Engine.
Пакет godot-lib.xxx.yyy.template_release.aar
для вашей версии Godot Engine можно найти на странице разработчика на Sourceforge.net.
- Выполните сборку проекта командой
gradle assemble
.
При успешном выполнении сборки в папке godot_example/android/plugins
будут созданы файлы:
RuStoreGodotAppUpdate.gdap
;RuStoreGodotAppUpdate.aar
;RuStoreGodotCore.gdap
;RuStoreGodotCore.aar
.
Обратите особое внимание, что библиотеки плагинов должны быть собраны под вашу версию Godot Engine.
-
Скопируйте содержимое папки
godot_example/android/plugins
в папкуyour_project/android/plugins
. -
В пресете сборки Android в списке Плагины отметьте строки Ru Store Godot App Update и Ru Store Godot Core.
Создание менеджера обновлений
Перед вызовом методов библиотеки необходимо создать менеджер обновлений.
var _appUpdate_client: RuStoreGodotAppUpdateManager = null
func _ready():
_appUpdate_client = RuStoreGodotAppUpdateManager.get_instance();
Проверка наличия обновлений
Прежде чем запрашивать обновление, проверьте, доступно ли обновление для вашего приложения. Для проверки наличия обновлений вызовите методget_app_update_info
. При вызове данного метода проверяются следующие условия.
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- Приложению RuStore разрешена установка приложений.
- Пользователь авторизован в RuStore.
Перед использованием метода необходимо единожды выполнить подписку на события:
on_get_app_update_info_success
;on_get_app_update_info_failure
.
func _ready():
# Инициализация _appUpdate_client
_appUpdate_client.on_get_app_update_info_success.connect(_on_get_app_update_info_success)
_appUpdate_client.on_get_app_update_info_failure.connect(_on_get_app_update_info_failure)
func _on_get_app_update_info_success(response: RuStoreAppUpdateInfo):
pass
func _on_get_app_update_info_failure(error: RuStoreError):
pass
_appUpdate_client.get_app_update_info()
on_get_app_update_info_success
возвращает объект, который содержит информацию о необходимости обновления. Запросите информацию заранее, чтобы выполнить запуск скачивания обновления без задержки в удобный для пользователя момент времени.
class_name RuStoreAppUpdateInfo extends Object
var updateAvailability: ERuStoreUpdateAvailability.Item
var installStatus: ERuStoreInstallStatus.Item
var availableVersionCode: int
func _init(json: String = ""):
if json == "":
updateAvailability = ERuStoreUpdateAvailability.Item.UNKNOWN
installStatus = ERuStoreInstallStatus.Item.UNKNOWN
availableVersionCode = 0
else:
var obj = JSON.parse_string(json)
updateAvailability = int(obj["updateAvailability"])
installStatus = int(obj["installStatus"])
availableVersionCode = int(obj["availableVersionCode"])
-
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)
— в ожидании.
-
availableVersionCode
— код версии обновления.
Запуск скач ивания обновления возможен только в том случае, если поле updateAvailability
содержит значение UPDATE_AVAILABLE
.
on_get_app_update_info_failure
возвращает объект с информацией об ошибке. Структура ошибки описана в разделе Обработка ошибок.
Скачивание и установка обновлений
Использование слушателя
После подтверждения доступности обновления (RuStoreAppUpdateInfo
) вы можете получать статус скачивания обновления. Для этого необходимо выполнить подписку на событие on_state_updated
и вызовом метода register_listener
запустить слушатель статуса скачивания.
Проверка статуса скачивания обновления
Подписка на событие on_state_updated
выполняется единожды. Прослушивание процесса скачивания активируется с помощью метода register_listener
.
func _ready():
# Инициализация _appUpdate_client
_appUpdate_client.on_state_updated.connect(_on_state_updated)
_appUpdate_client.register_listener()
func _on_state_updated(installState: RuStoreInstallState):
pass
Обратный вызов (callback) on_state_updated
возвращает объект RuStoreInstallState
с информацией о ходе процесса обновления.
class_name RuStoreInstallState extends Object
var bytesDownloaded: int
var totalBytesToDownload: int
var percentDownloaded: float
var installStatus: ERuStoreInstallStatus.Item
var installErrorCode: ERuStoreInstallErrorCode.Item
func _init(json: String = ""):
if json == "":
bytesDownloaded = 0
totalBytesToDownload = 0
percentDownloaded = 0
installStatus = ERuStoreInstallStatus.Item.UNKNOWN
installErrorCode = ERuStoreInstallErrorCode.Item.ERROR_UNKNOWN
else:
var obj = JSON.parse_string(json)
bytesDownloaded = int(obj["bytesDownloaded"])
totalBytesToDownload = int(obj["totalBytesToDownload"])
installStatus = int(obj["installStatus"])
installErrorCode = int(obj["installErrorCode"])
if totalBytesToDownload > 0:
percentDownloaded = float(bytesDownloaded) / totalBytesToDownload * 100
else:
percentDownloaded = 0
if installStatus == ERuStoreInstallStatus.Item.DOWNLOADED:
percentDownloaded = 100
-
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
— общее количество байт, которое необходимо скачать;packageName
— имя пакета обновления;installErrorCode
— код ошибки во время скачивания. Коды ошибок описаны в разделе Обработка ошибок.
Удаление слушателя
Если необходимости в сл ушателе больше нет, воспользуйтесь методом удаления слушателя unregisterListener
.
_appUpdate_client.unregister_listener()
Запуск скачивания обновления
Отложенное обновле ние
Описание сценария отложенного обновления
Обновление с UI от RuStore
- Пользователю будет показан диалог с UI от RuStore для подтверждения обновления.
- При нажатии на кнопку Обновить покажется диалоговое окно для подтверждения установки обновления.
Запуск сценария обновления
Перед использованием методов запуска сценариев обновления необходимо единожды выполнить подписку на события:
on_start_update_flow_success
;on_start_update_flow_failure
.
Для запуска скачивания обновления приложения используйте метод start_update_flow_delayed
.
Объект RuStoreAppUpdateInfo
после однократного использования становится невалидным. Для повторного вызова метода start_update_flow_delayed
запросите объект RuStoreAppUpdateInfo
повторно, используя метод get_app_update_info
.
См. раздел Проверка наличия обновлений.
func _ready():
# Инициализация _appUpdate_client
_appUpdate_client.on_start_update_flow_success.connect(_on_start_update_flow_success)
_appUpdate_client.on_start_update_flow_failure.connect(_on_start_update_flow_failure)
func _on_start_update_flow_success(flowResult: ERuStoreUpdateFlowResult.Item):
pass
func _on_start_update_flow_failure(error: RuStoreError):
pass
_appUpdate_client.start_update_flow_delayed()
Обратный вызов (callback) on_start_update_flow_success
возвращает перечисление ERuStoreUpdateFlowResult.Item
с информацией о результате обновления:
RESULT_OK (int = -1)
— пользователь подтвердил скачивание обновления;RESULT_CANCELED (int = 0)
— пользователь отказался от скачивания обновления.
Обратный вызов (callback) on_start_update_flow_failure
возвращает объект RuStoreError
с информацией об ошибке. Структура ошибки RuStoreError
описана в разделе Обработка ошибок.
После получения статуса ERuStoreUpdateFlowResult.Item.DOWNLOADED
в поле installStatus
объекта RuStoreInstallState
, должен быть вызван метод установки обновления.