En esta guía, se describe cómo admitir las actualizaciones de la app integradas en tu app con Unreal Engine. Hay guías separadas para casos en los que tu implementación usa los lenguajes de programación Kotlin o Java, y otros en los que ella usa código nativo (C/C++) o Unity.
Descripción general del SDK de Unreal Engine
La API de actualizaciones integradas en la app de Play forma parte de la familia del SDK de Play Core. La API para Unreal Engine ofrece una clase UInAppUpdatesManager para controlar la comunicación entre tu app y la API de Play. Después de que se realiza una solicitud, tu app puede verificar el
estado de la solicitud con EAppUpdateErrorCode.
Versiones compatibles de Unreal Engine
El complemento admite Unreal Engine 5.0 y todas las versiones posteriores.
Configura tu entorno de desarrollo
Descarga el complemento de Play para Unreal Engine desde el repositorio de GitHub.
Copia la carpeta
GooglePlaydentro de la carpetaPluginsen tu proyecto de Unreal Engine.Abre tu proyecto de Unreal Engine y haz clic en Edit → Plugins.
Busca Google Play y marca la casilla de verificación Habilitado.
Reinicia el proyecto del juego y activa una compilación.
Abre el archivo
Build.csde tu proyecto y agrega el móduloPlayInAppUpdatesaPublicDependencyModuleNames:using UnrealBuildTool; public class MyGame : ModuleRules { public MyGame(ReadOnlyTargetRules Target) : base(Target) { // ... PublicDependencyModuleNames.Add("PlayInAppUpdates"); // ... } }
Cómo comprobar la disponibilidad de actualizaciones
Antes de solicitar una actualización, verifica si hay alguna disponible para tu app. Usa UInAppUpdatesManager::RequestInfo para comprobar si hay una actualización:
MyClass.h
void MyClass::OnRequestInfoOperationCompleted(
EAppUpdateErrorCode ErrorCode,
UAppUpdateInfo* UpdateInfo)
{
// Check the resulting error code.
if (ErrorCode == EAppUpdateErrorCode::AppUpdate_NO_ERROR)
{
// Check AppUpdateInfo's UpdateAvailability, UpdatePriority,
// IsUpdateTypeAllowed(), ... and decide whether to ask the user
// to start an in-app update.
}
}
MyClass.cpp
void MyClass::CheckForUpdateAvailability()
{
// Create a delegate to bind the callback function.
FRequestInfoOperationCompletedDelegate Delegate;
// Bind the completion handler (OnRequestInfoOperationCompleted) to the delegate.
Delegate.BindDynamic(this, &MyClass::OnRequestInfoOperationCompleted);
// Initiate the request info operation, passing the delegate to handle the result.
GetGameInstance()
->GetSubsystem<UInAppUpdatesManager>()
->RequestInfo(Delegate);
}
La instancia UAppUpdateInfo que se muestra contiene el estado de disponibilidad de la actualización.
Si una actualización integrada en la app ya está en curso, la instancia también informa el estado de esa actualización.
Cómo verificar la obsolescencia de las actualizaciones
Además de comprobar si hay actualizaciones disponibles, te recomendamos que verifiques cuánto tiempo pasó desde que el usuario recibió una notificación sobre una actualización a través de Google Play Store. Esto puede ayudarte a decidir si debes iniciar una actualización flexible o una actualización inmediata. Por ejemplo, podrías esperar unos días antes de notificar al usuario con una actualización flexible y, luego, solicitar una actualización inmediata.
Usa UAppUpdateInfo:GetClientVersionStalenessDays para verificar la cantidad de días que transcurrieron desde que la actualización estuvo disponible en Play Store:
int32 ClientVersionStalenessDays = UpdateInfo->GetClientVersionStalenessDays();
Cómo verificar la prioridad de las actualizaciones
La API de Google Play Developer te permite establecer la prioridad de cada actualización. Esto permite que tu app decida con qué nivel de urgencia recomendar una actualización al usuario. Por ejemplo, considera la siguiente estrategia para establecer la prioridad de actualización:
- Mejoras menores en la IU: Actualización de baja prioridad. No solicites una actualización flexible ni una actualización inmediata.
- Mejoras en el rendimiento: actualización de prioridad media. Solicita una actualización flexible.
- Actualización crítica de seguridad: actualización de prioridad alta. Requiere una actualización inmediata.
Para determinar la prioridad, Google Play usa un valor entero entre 0 y 5, en el que 0 es la prioridad predeterminada y 5 es la más alta. A fin de establecer la prioridad para una actualización, usa el campo inAppUpdatePriority en Edits.tracks.releases en la API de Google Play Developer. Se considerará que todas las versiones agregadas en la original tendrán establecida la misma prioridad que esta última. Solo se puede establecer la prioridad al momento de lanzar una versión nueva; no se puede cambiar más tarde.
Establece la prioridad con la API de Google Play Developer, como se describe en la documentación de la API de Play Developer. La prioridad de la actualización de la app integrada debe especificarse en el recurso Edit.tracks que se pasa en el método Edit.tracks: update.
En el siguiente ejemplo, se muestra cómo lanzar una app con el código de versión 88 y el inAppUpdatePriority 5:
{
"releases": [{
"versionCodes": ["88"],
"inAppUpdatePriority": 5,
"status": "completed"
}]
}
En el código de tu app, puedes verificar el nivel de prioridad de una actualización determinada con
UAppUpdateInfo::UpdatePriority:
int32 Priority = UpdateInfo->GetPriority();
Cómo iniciar una actualización
Después de confirmar que hay una actualización disponible, puedes solicitarla con
UInAppUpdatesManager::StartUpdate. Antes de solicitar una actualización, asegúrate
de tener un objeto UAppUpdateInfo actualizado. También debes crear un objeto UAppUpdateOptions para configurar el flujo de actualización.
En el siguiente ejemplo, se crea un objeto UAppUpdateOptions para un flujo de actualización inmediato:
// Creates an UAppUpdateOptions defining an immediate in-app
// update flow and its parameters.
UAppUpdateOptions* Options = NewObject<UAppUpdateOptions>();
Options->CreateOptions(EAppUpdateType::AppUpdate_TYPE_IMMEDIATE);
En el siguiente ejemplo, se crea un objeto UAppUpdateOptions para un flujo de actualización flexible:
// Creates an UAppUpdateOptions defining a flexible in-app
// update flow and its parameters.
UAppUpdateOptions* Options = NewObject<UAppUpdateOptions>();
Options->CreateOptions(EAppUpdateType::AppUpdate_TYPE_FLEXIBLE);
El objeto UAppUpdateOptions también contiene una función IsAssetPackDeletionAllowed que indica si la actualización puede borrar los paquetes de recursos en caso de que el dispositivo tenga almacenamiento limitado. Este campo se establece como false de forma predeterminada, pero puedes usar UAppUpdateOptions::SetAssetPackDeletionAllowed para establecerlo en true:
// Sets the AssetPackDeletionAllowed field to true.
Options->SetAssetPackDeletionAllowed(true);
Los siguientes pasos dependen de si solicitas una actualización flexible o una actualización inmediata.
Cómo manejar una actualización flexible
Una vez que tengas un objeto UAppUpdateInfo actualizado y un objeto UAppUpdateOptions configurado correctamente, podrás llamar a UInAppUpdatesManager::StartUpdate para solicitar un flujo de actualización.
MyClass.h
void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
MyClass.cpp
// .cpp
void MyClass::StartUpdate()
{
// Create a delegate to bind the callback function.
FUpdateOperationCompletedDelegate Delegate;
// Bind the completion handler (OnStartUpdateOperationCompleted) to the delegate.
Delegate.BindDynamic(this, &MyClass::OnStartUpdateOperationCompleted);
// Initiate the start update operation, passing the delegate to handle the result.
GetGameInstance()
->GetSubsystem<UInAppUpdatesManager>()
->StartUpdate(UpdateInfo, UpdateOptions, Delegate);
}
Para un flujo de actualización flexible, debes activar la instalación de la actualización de la app una vez que la descarga finalice correctamente. Para ello, llama a InAppUpdatesManager::CompleteUpdate, como se muestra en el siguiente ejemplo:
MyClass.h
void MyClass::OnCompleteUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
MyClass.cpp
void MyClass::CompleteFlexibleUpdate()
{
// Create a delegate to bind the callback function.
FUpdateOperationCompletedDelegate Delegate;
// Bind the completion handler (OnCompleteUpdateOperationCompleted) to the delegate.
Delegate.BindDynamic(this, &MyClass::OnCompleteUpdateOperationCompleted);
// Initiate the complete update operation, passing the delegate to handle the result.
GetGameInstance()
->GetSubsystem<UInAppUpdatesManager>()
->CompleteUpdate(UpdateInfo, UpdateOptions, Delegate);
}
Cómo manejar una actualización inmediata
Una vez que tengas un objeto UAppUpdateInfo actualizado y un objeto UAppUpdateOptions configurado correctamente, podrás llamar a InAppUpdatesManager::StartUpdate para solicitar un flujo de actualización.
MyClass.h
void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
MyClass.cpp
void MyClass::StartUpdate()
{
// Create a delegate to bind the callback function.
FUpdateOperationCompletedDelegate Delegate;
// Bind the completion handler (OnStartUpdateOperationCompleted) to the delegate.
Delegate.BindDynamic(this, &MyClass::OnStartUpdateOperationCompleted);
// Initiate the start update operation, passing the delegate to handle the result.
GetGameInstance()
->GetSubsystem<UInAppUpdatesManager>()
->StartUpdate(UpdateInfo, UpdateOptions, Delegate);
}
Para obtener un flujo de actualización inmediata, Google Play muestra un cuadro de diálogo de confirmación del usuario. Cuando el usuario acepta la solicitud, Google Play descarga e instala automáticamente la actualización, luego, reinicia la app a la versión actualizada si la instalación se realizó correctamente.
Administración de errores
En esta sección, se describen las soluciones de errores comunes.
- Si
UInAppUpdatesManager::StartUpdatedevuelve un errorAppUpdate_INVALID_REQUEST, significa queUAppUpdateInfono es válido. Asegúrate de que el objetoUAppUpdateInfoque se muestra desdeUInAppUpdatesManager::RequestInfono sea nulo antes de iniciar el flujo de actualización. - Si
UInAppUpdatesManager::StartUpdatedevuelve el errorAppUpdate_NOT_ALLOWED, significa que el objetoUAppUpdateOptionsindica un tipo de actualización que no está permitido para la actualización disponible. Antes de iniciar el flujo de actualización, verifica si el objetoUAppUpdateInfoindica que se permite el tipo de actualización seleccionado.
Próximos pasos
Prueba las actualizaciones integradas en la app para verificar que la integración funcione correctamente.