SDK Обновление приложений для Unreal (версия 10.5.1)
Общие сведения
RuStore In-app updates SDK поддерживает актуальную версию приложения на устройстве пользователя. Это помогает пользователю увидеть обновления, оценить улучшение производительности и результат исправления ошибок.
Пример реализации
Используйте RuStore In-app updates SDK для реализации различных способов обновлений. В настоящий момент поддерживаются: отложенное, тихое (без UI от RuStore) и принудительное обновление.
Ознакомьтесь с приложением-примером чтобы узнать, как правильно интегрировать SDK обновлений.
Пользовательские сценарии
- Отложенное обновление
- Принудительное обновление
- Тихое обновление



Условия корректной работы SDK
Для работы RuStore In-app updates SDK необходимо соблюдение следующих условий.
- Загружены данные о приложении в разделе Push-уведомления > Проекты из RuStore Консоль.
Приложение прошло модерацию (публиковать приложение необязательно).
.
- Подпись и package name различных типов сборок вашего приложения (debug, release и т.д.) могут отличаться друг от друга. В таком случае вы должны создать в разделе Push-уведомления > Проекты из RuStore Консоль проект под каждый тип сборки..
- ОС Android версии 7.0 или выше.
- Версия RuStore на устройстве пользователя актуальная.
- Пользователь авторизован в RuStore.
- Приложению RuStore разрешена установка приложений.
Подключение в проект
-
Перейдите в раздел Релизы репозитория проекта на GitFlic.
-
Скачайте из выбранного релиза артефакты:
RuStoreAppUpdate.zipRuStoreCore.zip
-
Распакуйте скачанные архивы в папку
Pluginsв корне вашего Unreal-проекта, чтобы получилась следующая структура:
📁 your_project
└─ 📁 Plugins
├─ 📁 RuStoreAppUpdate
│ ├─ 📁 Binaries
│ ├─ 📁 Content
│ ├─ 📁 Intermediate
│ ├─ 📁 Resources
│ ├─ 📁 Source
│ └─ RuStoreAppUpdate.uplugin
└─ 📁 RuStoreCore
├─ 📁 Binaries
├─ 📁 Content
├─ 📁 Intermediate
├─ 📁 Resources
├─ 📁 Source
└─ RuStoreCore.uplugin
-
Перезапустите 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— код ошибки во время скачивания. Коды ошибок описаны в разделе Обработка ошибок.