SDK обновлений для Unreal 1.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 разрешена установка приложений.
Подключение в проект
Для подключения выполните следующие шаги.
- Скопируйте содержимое папки
Plugins
из официального репозитория RuStore на gitflic в папкуPlugins
внутри своего проекта. - Перезапустите Unreal Engine.
- В списке плагинов (Edit > Plugins > Project > Mobile) отметьте плагины RuStoreAppUpdate и RuStoreCore.
- Подключите модули модули
RuStoreCore
иRuStoreAppUpdate
в файлеYourProject.Build.cs
в спискеPublicDependencyModuleNames
. - В настройках проекта (Edit > Project Settings > Android) установите параметр
Minimum SDK Version
на уровень не ниже24
и параметрTarget SDK Version
не ниже31
.
Создание менеджера обновлений
Перед вызовом методов библиотеки необходимо создать менеджер обновлений.
Инициализация
Перед вызовом методов библиотеки необходимо выполнить её инициализацию.
URuStoreAppUpdateManager::Instance()->Init();
Все операции с объектом менеджера также доступны из Blueprints. Ниже преставлен пример инициализации.
Вызов Init
привязывает объект к корню сцены, и если дальнейшая работа с объектом больше не планируется, для освобождения памяти необходимо выполнить метод Dispose
. Вызов метода Dispose
отвяжет объект от корня и безопасно зав ершит все отправленные запросы.
Деинициализация
URuStoreAppUpdateManager::Instance()->Dispose();
Проверка инициализации
Если вам нужно проверить факт инициализации библиотеки, используйте метод GetIsInitialized
. Метод возвращает значение типа bool
:
true
— если библиотека инициализирована;false
— еслиInit
еще не был вызван.
bool bIsInitialized = URuStoreAppUpdateManager::Instance()->GetIsInitialized();
Проверка наличия обновлений
Прежде чем запрашивать обновление, проверьте, доступно ли обновление для вашего приложения. Для проверки наличия обновлений вызовите методGetAppUpdateInfo
. При вызове данного метода проверяются следующие условия.
- На устройстве пользователя установлена актуальная версия RuStore.
- Пользователь и приложение не должны быть заблокированы в RuStore.
- Приложению RuStore разрешена установка приложений.
- Пользователь авторизован в RuStore.
FURuStoreAppUpdateInfo
, который будет содержать в себе информацию о необходимости обновления. Запросите этот объект заранее и закэшируйте его, чтобы запросить у пользователя запуск скачивания обновления без задержки и в удобный для пользователя момент времени.
Каждый запрос GetAppUpdateInfo
возвращает requestId
, который уникален в рамках одного запуска приложения. Каждое событие возвращает requestId
того запроса, который запустил это событие.
long requestId = GetAppUpdateInfo(
[](long requestId, TSharedPtr<FURuStoreAppUpdateInfo, ESPMode::ThreadSafe> response) {
// Process response
},
[](long requestId, TSharedPtr<FURuStoreError, ESPMode::ThreadSafe> error) {
// Process error
}
);
Уведомление обратного вызов (callback) Success
возвращает структуру FURuStoreAppUpdateInfo
в параметре Response
. Структура содержит набор параметров, необходимых для определения доступности обновления.
USTRUCT(BlueprintType)
struct RUSTOREAPPUPDATE_API FURuStoreAppUpdateInfo
{
GENERATED_USTRUCT_BODY()
FURuStoreAppUpdateInfo()
{
updateAvailability = EURuStoreUpdateAvailability::UNKNOWN;
installStatus = EURuStoreInstallStatus::UNKNOWN;
availableVersionCode = 0;
}
UPROPERTY(BlueprintReadOnly)
EURuStoreUpdateAvailability updateAvailability;
UPROPERTY(BlueprintReadOnly)
EURuStoreInstallStatus installStatus;
UPROPERTY(BlueprintReadOnly)
int64 availableVersionCode;
};
-
updateAvailability
— доступность обновления:UNKNOWN (uint8 = 0)
— по умолчанию;UPDATE_NOT_AVAILABLE (uint8 = 1)
— обновление не нужно;UPDATE_AVAILABLE (uint8 = 2)
— обновление требуется загрузить или обновление уже загружено на устройство пользователя;DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS (uint8 = 3)
— обновление уже скачивается или установка уже запущена.
-
installStatus
— статус установки обновления, если пользователь уже устанавливает обновление в текущий момент времени:UNKNOWN (uint8 = 0)
— по умолчанию;DOWNLOADED (uint8 = 1)
— скачано;DOWNLOADING (uint8 = 2)
— скачивается;FAILED (uint8 = 3)
— ошибка;PENDING (uint8 = 5)
— в ожидании.
-
availableVersionCode
— код версии обновления.
Запуск скачивания обновления возможен только в том случае, если поле updateAvailability
содержит значение UPDATE_AVAILABLE
.
Failure
возвращает структуру с информацией об ошибке. Структура ошибки описана в разделе Обработка ошибок.
Скачивание и установка обновлений
Использование слушателя
После подтверждения доступности запуска процесса обновления вы можете получить статус скачивания обновления в событии OnStateUpdatedInstanceEvent
объекта URuStoreAppUpdateManager
.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FRuStoreOnStateUpdatedInstanceDelegate, int64, listenerId, FURuStoreInstallState, state);
UPROPERTY(BlueprintAssignable, Category = "RuStore AppUpdate Manager")
FRuStoreOnStateUpdatedInstanceDelegate OnStateUpdatedInstanceEvent;
FScriptDelegate Delegate;
Delegate.BindUFunction(YourUObjectPtr, FName("YourCallbackMethod"));
URuStoreAppUpdateManager::Instance()->OnStateUpdatedInstanceEvent.Add(Delegate);
UFUNCTION()
void YourCallbackMethod(int64 listenerId, FURuStoreInstallState state) {
// Process callback
}
Подписка на событие слушателя из Blueprint.
Событие OnStateUpdatedInstanceEvent
возвращает объект FURuStoreInstallState
в параметре state
с описанием текущего статуса скачивания. Структура FURuStoreInstallState
описана в разделе Проверка статуса скачивания обновления.
Интерфейс слушателя
Класс URuStoreAppUpdateManager
реализует стандартный слушатель. Вы можете создать собственный класс слушателя используя интерфейс IRuStoreInstallStateUpdateListenerInterface
.
UINTERFACE(Blueprintable)
class RUSTOREAPPUPDATE_API URuStoreInstallStateUpdateListenerInterface : public UInterface
{
GENERATED_BODY()
};
class IRuStoreInstallStateUpdateListenerInterface
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "RuStore InstallStateUpdate Listener Interface")
void OnStateUpdated(int64 listenerId, FURuStoreInstallState& state);
};
Событие OnStateUpdated
возвращает объект FURuStoreInstallState
в параметре state
с описанием текущего статуса скачивания. Структура FURuStoreInstallState
описана в разделе Проверка статуса скачивания обновления.
Вызов метода RegisterListener
выполняет регистрацию слушателя.
Для стандартного слушателя URuStoreAppUpdateManager
вызов RegisterListener
не требуется.
int64 listenerId = URuStoreAppUpdateManager::Instance()->RegisterListener(YourListenerPtr);
YourListenerPtr
— указатель на объект класса, реализующего интерфейс IRuStoreInstallStateUpdateListenerInterface
.
Проверка статуса скачивания обновления
Структура FURuStoreInstallState
описывает текущий статус скачивания.
USTRUCT(BlueprintType)
struct RUSTOREAPPUPDATE_API FURuStoreInstallState
{
GENERATED_USTRUCT_BODY()
FURuStoreInstallState()
{
bytesDownloaded = 0;
totalBytesToDownload = 0;
percentDownloaded = 0;
installStatus = EURuStoreInstallStatus::UNKNOWN;
installErrorCode = EURuStoreInstallErrorCode::ERROR_UNKNOWN;
}
UPROPERTY(BlueprintReadWrite)
int64 bytesDownloaded;
UPROPERTY(BlueprintReadWrite)
int64 totalBytesToDownload;
UPROPERTY(BlueprintReadWrite)
float percentDownloaded;
UPROPERTY(BlueprintReadWrite)
EURuStoreInstallStatus installStatus;
UPROPERTY(BlueprintReadWrite)
EURuStoreInstallErrorCode installErrorCode;
};
bytesDownloaded
— количество загруженных байт;totalBytesToDownload
— общее количество байт, которое необходимо загрузить;percentDownloaded
— процент прогресса загрузки обновления;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
).
installErrorCode
— код ошибки во время скачивания. Коды ошибок описаны в разделе Обработка ошибок.
Удаление слушателя
Если необходимости в слушателе больше нет, воспользуйтесь методом удаления слушателя UnregisterListener
, передав в метод ранее зарегистрированный слушатель. UnregisterListener
должен быть вызван для всех слушателей до завершения работы приложения.
Для стандартного слушателя URuStoreAppUpdateManager
вызов UnregisterListener
при завершении работы приложения не требуется.
bool bIsDone = URuStoreAppUpdateManager::Instance()->UnregisterListener(YourListenerPtr);
YourListenerPtr
— указатель на объект класса, реализующего интерфейс IRuStoreInstallStateUpdateListenerInterface
.
В случае реализации собственного слушателя, для экономии ресурсов, вы также можете выполнить отмену регистрации стандартного слушателя.
auto instance = URuStoreAppUpdateManager::Instance();
bool bIsDone = instance->UnregisterListener(instance);