Unterstützung von In-App-Updates (Unity)

In diesem Leitfaden wird beschrieben, wie Sie In-App-Updates in Ihrer App mit Unity unterstützen. Es gibt separate Leitfäden für Fälle, in denen Ihre Implementierung die Programmiersprache Kotlin oder die Programmiersprache Java verwendet, und Fälle, in denen Ihre Implementierung nativen Code (C/C++) verwendet.

Entwicklungsumgebung einrichten

Laden Sie die neueste Version des Play In-App Update Unity-Plug-ins aus den Google-Paketen für Unity herunter.

Unity SDK – Übersicht

Die Play In-App Update API ist Teil der Play Core SDK-Familie. Das Unity-Plug-in bietet die Klasse AppUpdateManager zur Verwaltung der Kommunikation zwischen Ihrer App und der Play API. Du musst diese Klasse instanziieren, bevor du sie zum Verwalten von In-App-Updates verwenden kannst:

AppUpdateManager appUpdateManager = new AppUpdateManager();

Verfügbarkeit von Updates prüfen

Bevor Sie ein Update anfordern, prüfen Sie, ob für die Anwendung ein Update verfügbar ist. Verwenden Sie AppUpdateManager, um in einer Koroutine nach einem Update zu suchen:

IEnumerator CheckForUpdate()
{
  PlayAsyncOperation<AppUpdateInfo, AppUpdateErrorCode> appUpdateInfoOperation =
    appUpdateManager.GetAppUpdateInfo();

  // Wait until the asynchronous operation completes.
  yield return appUpdateInfoOperation;

  if (appUpdateInfoOperation.IsSuccessful)
  {
    var appUpdateInfoResult = appUpdateInfoOperation.GetResult();
    // Check AppUpdateInfo's UpdateAvailability, UpdatePriority,
    // IsUpdateTypeAllowed(), etc. and decide whether to ask the user
    // to start an in-app update.
  }
  else
  {
    // Log appUpdateInfoOperation.Error.
  }
}

Die zurückgegebene AppUpdateInfo-Instanz enthält den Verfügbarkeitsstatus des Updates. Wenn bereits ein In-App-Update läuft, meldet die Instanz auch den Status des laufenden Updates.

Update-Veralterung prüfen

Sie können nicht nur prüfen, ob ein Update verfügbar ist, sondern auch, wie viel Zeit vergangen ist, seit der Nutzer das letzte Mal über den Play Store über ein Update benachrichtigt wurde. Dies kann Ihnen bei der Entscheidung helfen, ob Sie ein flexibles oder ein sofortiges Update initiieren sollten. Beispielsweise können Sie einige Tage warten, bevor Sie den Nutzer mit einem flexiblen Update benachrichtigen, und einige Tage danach, bevor Sie eine sofortige Aktualisierung anfordern.

Mit ClientVersionStalenessDays kannst du prüfen, wie viele Tage seit der Einführung des Updates im Play Store vergangen sind:

var stalenessDays = appUpdateInfoOperation.ClientVersionStalenessDays;

Updatepriorität prüfen

Mit der Google Play Developer API können Sie die Priorität jedes Updates festlegen. Auf diese Weise kann deine App entscheiden, wie stark sie dem Nutzer ein Update empfehlen sollte. Betrachten Sie beispielsweise die folgende Strategie zum Festlegen der Aktualisierungspriorität:

  • Kleinere Verbesserungen an der Benutzeroberfläche: Update mit niedriger Priorität. Fordern Sie weder ein flexibles noch ein sofortiges Update an.
  • Leistungsverbesserungen: Update mit mittlerer Priorität; fordern Sie ein flexibles Update an.
  • Kritisches Sicherheitsupdate: Update mit hoher Priorität. Fordern Sie ein sofortiges Update an.

Zur Bestimmung der Priorität verwendet Google Play eine Ganzzahl zwischen 0 und 5, wobei 0 die Standardeinstellung und 5 die höchste Priorität ist. Du kannst die Priorität für ein Update in der Google Play Developer API im Feld inAppUpdatePriority unter Edits.tracks.releases festlegen. 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 und später nicht mehr geändert werden.

Legen Sie die Priorität mithilfe der Google Play Developer API fest, wie in der Dokumentation zur Play Developer API beschrieben. Die Priorität für In-App-Updates sollte in der Ressource Edit.tracks angegeben werden, die in der Methode Edit.tracks: update übergeben wird. Im folgenden Beispiel wird die Veröffentlichung einer App mit den Versionscodes 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 UpdatePriority prüfen:

var priority = appUpdateInfoOperation.UpdatePriority;

Update starten

Wenn Sie sichergestellt haben, dass ein Update verfügbar ist, können Sie es mit AppUpdateManager.StartUpdate() anfordern. Bevor Sie eine Aktualisierung anfordern, prüfen Sie, ob das AppUpdateInfo-Objekt auf dem neuesten Stand ist. Außerdem müssen Sie ein AppUpdateOptions-Objekt erstellen, um den Aktualisierungsablauf zu konfigurieren.

Im folgenden Beispiel wird ein AppUpdateOptions-Objekt für einen sofortigen Aktualisierungsablauf erstellt:

// Creates an AppUpdateOptions defining an immediate in-app
// update flow and its parameters.
var appUpdateOptions = AppUpdateOptions.ImmediateAppUpdateOptions();

Im folgenden Beispiel wird ein AppUpdateOptions-Objekt für einen flexiblen Aktualisierungsablauf erstellt:

// Creates an AppUpdateOptions defining a flexible in-app
// update flow and its parameters.
var appUpdateOptions = AppUpdateOptions.FlexibleAppUpdateOptions();

Das AppUpdateOptions-Objekt enthält außerdem ein AllowAssetPackDeletion-Feld, das definiert, ob bei der Aktualisierung Asset-Packs bei begrenztem Gerätespeicher gelöscht werden dürfen. Dieses Feld ist standardmäßig auf false gesetzt, Sie können jedoch das optionale Argument allowAssetPackDeletion an ImmediateAppUpdateOptions() oder FlexibleAppUpdateOptions() übergeben, um es stattdessen auf true festzulegen:

// Creates an AppUpdateOptions for an immediate flow that allows
// asset pack deletion.
var appUpdateOptions =
  AppUpdateOptions.ImmediateAppUpdateOptions(allowAssetPackDeletion: true);

// Creates an AppUpdateOptions for a flexible flow that allows asset
// pack deletion.
var appUpdateOptions =
  AppUpdateOptions.FlexibleAppUpdateOptions(allowAssetPackDeletion: true);

Die nächsten Schritte hängen davon ab, ob Sie ein flexibles Update oder ein sofortiges Update anfordern.

Flexible Updates verarbeiten

Wenn Sie ein aktuelles AppUpdateInfo-Objekt und ein korrekt konfiguriertes AppUpdateOptions-Objekt haben, können Sie AppUpdateManager.StartUpdate() aufrufen, um asynchron einen Aktualisierungsvorgang anzufordern.

IEnumerator StartFlexibleUpdate()
{
  // Creates an AppUpdateRequest that can be used to monitor the
  // requested in-app update flow.
  var startUpdateRequest = appUpdateManager.StartUpdate(
    // The result returned by PlayAsyncOperation.GetResult().
    appUpdateInfoResult,
    // The AppUpdateOptions created defining the requested in-app update
    // and its parameters.
    appUpdateOptions);

  while (!startUpdateRequest.IsDone)
  {
  // For flexible flow,the user can continue to use the app while
  // the update downloads in the background. You can implement a
  // progress bar showing the download status during this time.
  yield return null;
  }

}

Für einen flexiblen Updatevorgang müssen Sie die Installation des App-Updates auslösen, nachdem der Download erfolgreich abgeschlossen wurde. Rufen Sie dazu AppUpdateManager.CompleteUpdate() auf, wie im folgenden Beispiel gezeigt:

IEnumerator CompleteFlexibleUpdate()
{
  var result = appUpdateManager.CompleteUpdate();
  yield return result;

  // If the update completes successfully, then the app restarts and this line
  // is never reached. If this line is reached, then handle the failure (e.g. by
  // logging result.Error or by displaying a message to the user).
}

Ein sofortiges Update durchführen

Wenn Sie ein aktuelles AppUpdateInfo-Objekt und ein korrekt konfiguriertes AppUpdateOptions-Objekt haben, können Sie AppUpdateManager.StartUpdate() aufrufen, um asynchron einen Aktualisierungsvorgang anzufordern.

IEnumerator StartImmediateUpdate()
{
  // Creates an AppUpdateRequest that can be used to monitor the
  // requested in-app update flow.
  var startUpdateRequest = appUpdateManager.StartUpdate(
    // The result returned by PlayAsyncOperation.GetResult().
    appUpdateInfoResult,
    // The AppUpdateOptions created defining the requested in-app update
    // and its parameters.
    appUpdateOptions);
  yield return startUpdateRequest;

  // If the update completes successfully, then the app restarts and this line
  // is never reached. If this line is reached, then handle the failure (for
  // example, by logging result.Error or by displaying a message to the user).
}

Damit ein Update sofort schnellstmöglich durchgeführt werden kann, wird in Google Play ein Dialogfeld zum Bestätigen des Updates angezeigt. Wenn der Nutzer die Anfrage akzeptiert, lädt Google Play das Update automatisch herunter und installiert es. Wenn die Installation erfolgreich war, wird die App mit der aktualisierten Version neu gestartet.

Fehlerbehandlung

In diesem Abschnitt werden Lösungen für häufige Fehler beschrieben.

  • Wenn StartUpdate() ein ArgumentNullException ausgibt, bedeutet dies, dass AppUpdateInfo null ist. Achten Sie darauf, dass das von GetAppUpdateInfo() zurückgegebene AppUpdateInfo-Objekt nicht null ist, bevor Sie den Aktualisierungsvorgang starten.
  • Wenn PlayAsyncOperation den Fehlercode ErrorUpdateUnavailable zurückgibt, prüfen Sie, ob eine aktualisierte App-Version mit derselben Anwendungs-ID und demselben Signaturschlüssel verfügbar ist.
  • Wenn PlayAsyncOperation den Fehlercode ErrorUpdateNotAllowed zurückgibt, gibt das Objekt AppUpdateOptions einen Updatetyp an, der für das verfügbare Update nicht zulässig ist. Prüfen Sie, ob das Objekt AppUpdateInfo angibt, dass der ausgewählte Aktualisierungstyp zulässig ist, bevor Sie den Aktualisierungsvorgang starten.

Nächste Schritte

Teste die In-App-Updates deiner App, um zu prüfen, ob die Integration korrekt funktioniert.