In diesem Leitfaden wird beschrieben, wie Sie mit Unreal Engine In-App-Updates in Ihrer App unterstützen. Es gibt separate Anleitungen für den Fall, dass in Ihrer Implementierung die Programmiersprache Kotlin oder die Programmiersprache Java verwendet wird, und für den Fall, dass in Ihrer Implementierung nativer Code (C/C++) oder Unity verwendet wird.
Unreal Engine SDK – Übersicht
Die Play In-App-Updates API ist Teil der Play Core SDK-Familie. Die API für die Unreal Engine bietet eine UInAppUpdatesManager
-Klasse, um die Kommunikation zwischen Ihrer App und der Play API zu steuern. Nach einer Anfrage kann Ihre App den Status der Anfrage mit EAppUpdateErrorCode
prüfen.
Unterstützte Unreal Engine-Versionen
Das Plug-in unterstützt Unreal Engine 5.0 und alle nachfolgenden Versionen.
Entwicklungsumgebung einrichten
Lade das Play Unreal Engine-Plug-in aus dem GitHub-Repository herunter.
Kopieren Sie den Ordner
GooglePlay
in den OrdnerPlugins
in Ihrem Unreal Engine-Projekt.Öffnen Sie Ihr Unreal Engine-Projekt und klicken Sie auf Bearbeiten → Plug-ins.
Suchen Sie nach Google Play und klicken Sie das Kästchen Aktiviert an.
Starten Sie das Spielprojekt neu und lösen Sie einen Build aus.
Öffnen Sie die
Build.cs
-Datei Ihres Projekts und fügen SiePublicDependencyModuleNames
dasPlayInAppUpdates
-Modul hinzu:using UnrealBuildTool; public class MyGame : ModuleRules { public MyGame(ReadOnlyTargetRules Target) : base(Target) { // ... PublicDependencyModuleNames.Add("PlayInAppUpdates"); // ... } }
Verfügbarkeit von Updates prüfen
Bevor Sie ein Update anfordern, prüfen Sie, ob ein Update für Ihre App verfügbar ist. So können Sie mit UInAppUpdatesManager::RequestInfo
nach einem Update suchen:
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.
}
}
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);
}
Die zurückgegebene UAppUpdateInfo
-Instanz enthält den Status der Verfügbarkeit des Updates.
Wenn bereits ein In-App-Update ausgeführt wird, gibt die Instanz auch den Status des laufenden Updates an.
Aktualität von Updates prüfen
Sie sollten nicht nur prüfen, ob ein Update verfügbar ist, sondern auch, wie viel Zeit vergangen ist, seit der Nutzer zuletzt über den Play Store über ein Update informiert wurde. So können Sie leichter entscheiden, ob Sie ein flexibles Update oder ein sofortiges Update starten sollten. Sie können beispielsweise einige Tage warten, bevor Sie den Nutzer über ein flexibles Update informieren, und einige Tage danach, bevor Sie ein sofortiges Update verlangen.
Mit UAppUpdateInfo:GetClientVersionStalenessDays
können Sie die Anzahl der Tage abrufen, seit das Update im Play Store verfügbar ist:
int32 ClientVersionStalenessDays = UpdateInfo->GetClientVersionStalenessDays();
Priorität des Updates prüfen
Mit der Google Play Developer API können Sie die Priorität jedes Updates festlegen. So kann Ihre App entscheiden, wie dringend ein Update für den Nutzer empfohlen werden soll. Betrachten Sie beispielsweise die folgende Strategie zum Festlegen der Updatepriorität:
- Kleinere Verbesserungen an der Benutzeroberfläche: Update mit niedriger Priorität; weder ein flexibles noch ein sofortiges Update anfordern.
- Leistungsverbesserungen: Aktualisierung mit mittlerer Priorität; flexible Aktualisierung anfordern.
- Kritisches Sicherheitsupdate: Update mit hoher Priorität; sofortiges Update anfordern.
Zur Bestimmung der Priorität verwendet Google Play einen Ganzzahlwert zwischen 0 und 5. Dabei ist 0 der Standardwert und 5 die höchste Priorität. Verwenden Sie das Feld inAppUpdatePriority
unter Edits.tracks.releases
in der Google Play Developer API, um die Priorität für ein Update festzulegen. Alle neu hinzugefügten Versionen im Release haben dieselbe Priorität wie der Release. Die Priorität kann nur beim Roll-out eines neuen Release festgelegt werden und kann später nicht mehr geändert werden.
Legen Sie die Priorität mit der Google Play Developer API wie in der Dokumentation zur Google Play Developer API beschrieben fest. Die Priorität für In-App-Updates sollte in der Edit.tracks
-Ressource angegeben werden, die in der Methode Edit.tracks: update
übergeben wird.
Im folgenden Beispiel wird die Veröffentlichung einer App mit dem Versionscode 88 und inAppUpdatePriority
5 veranschaulicht:
{ "releases": [{ "versionCodes": ["88"], "inAppUpdatePriority": 5, "status": "completed" }] }
Im Code Ihrer App können Sie die Prioritätsstufe für ein bestimmtes Update mit UAppUpdateInfo::UpdatePriority
prüfen:
int32 Priority = UpdateInfo->GetPriority();
Update starten
Nachdem Sie bestätigt haben, dass ein Update verfügbar ist, können Sie es mit UInAppUpdatesManager::StartUpdate
anfordern. Bevor Sie ein Update anfordern, müssen Sie ein aktuelles UAppUpdateInfo
-Objekt haben. Außerdem müssen Sie ein UAppUpdateOptions
-Objekt erstellen, um den Aktualisierungsablauf zu konfigurieren.
Im folgenden Beispiel wird ein UAppUpdateOptions
-Objekt für einen sofortigen Aktualisierungsablauf erstellt:
// Creates an UAppUpdateOptions defining an immediate in-app
// update flow and its parameters.
UAppUpdateOptions* Options = NewObject<UAppUpdateOptions>();
Options->CreateOptions(EAppUpdateType::AppUpdate_TYPE_IMMEDIATE);
Im folgenden Beispiel wird ein UAppUpdateOptions
-Objekt für einen flexiblen Aktualisierungsablauf erstellt:
// Creates an UAppUpdateOptions defining a flexible in-app
// update flow and its parameters.
UAppUpdateOptions* Options = NewObject<UAppUpdateOptions>();
Options->CreateOptions(EAppUpdateType::AppUpdate_TYPE_FLEXIBLE);
Das UAppUpdateOptions
-Objekt enthält außerdem eine IsAssetPackDeletionAllowed
-Funktion, die zurückgibt, ob das Update Asset-Pakete löschen darf, wenn der Gerätespeicher begrenzt ist. Dieses Feld ist standardmäßig auf false
gesetzt. Sie können es aber auch mit UAppUpdateOptions::SetAssetPackDeletionAllowed
auf true
setzen:
// Sets the AssetPackDeletionAllowed field to true.
Options->SetAssetPackDeletionAllowed(true);
Die nächsten Schritte hängen davon ab, ob Sie eine flexible Aktualisierung oder eine sofortige Aktualisierung anfordern.
Flexibles Update verarbeiten
Sobald du ein aktuelles UAppUpdateInfo
-Objekt und ein richtig konfiguriertes UAppUpdateOptions
-Objekt hast, kannst du UInAppUpdatesManager::StartUpdate
aufrufen, um einen Aktualisierungsablauf anzufordern.
void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
// .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);
}
Für einen flexiblen Updateablauf müssen Sie die Installation des App-Updates auslösen, nachdem der Download erfolgreich abgeschlossen wurde. Rufen Sie dazu InAppUpdatesManager::CompleteUpdate
auf, wie im folgenden Beispiel gezeigt:
void MyClass::OnCompleteUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
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);
}
Sofortige Aktualisierung verarbeiten
Sobald du ein aktuelles UAppUpdateInfo
-Objekt und ein richtig konfiguriertes UAppUpdateOptions
-Objekt hast, kannst du InAppUpdatesManager::StartUpdate
aufrufen, um einen Aktualisierungsablauf anzufordern.
void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
// ...
}
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);
}
Bei einem sofortigen Update wird bei Google Play ein Bestätigungsdialogfeld für Nutzer angezeigt. Wenn der Nutzer die Anfrage akzeptiert, wird das Update automatisch von Google Play heruntergeladen und installiert. Anschließend wird die App mit der aktualisierten Version neu gestartet, sofern die Installation erfolgreich war.
Fehlerbehandlung
In diesem Abschnitt werden Lösungen für häufige Fehler beschrieben.
- Wenn
UInAppUpdatesManager::StartUpdate
den FehlerAppUpdate_INVALID_REQUEST
zurückgibt, istUAppUpdateInfo
ungültig. Achte darauf, dass das vonUInAppUpdatesManager::RequestInfo
zurückgegebeneUAppUpdateInfo
-Objekt nicht null ist, bevor du den Aktualisierungsvorgang startest. - Wenn
UInAppUpdatesManager::StartUpdate
den FehlerAppUpdate_NOT_ALLOWED
zurückgibt, gibt dasUAppUpdateOptions
-Objekt einen Updatetyp an, der für das verfügbare Update nicht zulässig ist. Prüfen Sie, ob imUAppUpdateInfo
-Objekt angegeben ist, dass der ausgewählte Updatetyp zulässig ist, bevor Sie den Updatevorgang starten.
Nächste Schritte
Testen Sie die In-App-Updates Ihrer App, um zu prüfen, ob die Integration ordnungsgemäß funktioniert.