Obsługa aktualizacji w aplikacji (Unity)

Z tego przewodnika dowiesz się, jak obsługiwać aktualizacje w aplikacji za pomocą Unity. Istnieją osobne przewodniki dotyczące przypadków, w których Twoja implementacja korzysta z języka programowania Kotlin lub języka programowania Java oraz przypadków, gdy w implementacji wykorzystuje się kod natywny (C/C++).

Konfigurowanie środowiska programistycznego

Pobierz najnowszą wersję wtyczki Unity do aktualizacji w aplikacji przez Play z pakietów Google dla Unity.

Omówienie pakietu SDK Unity

Interfejs Play In-App Update API należy do Play Core SDK. Wtyczka Unity udostępnia klasę AppUpdateManager do obsługi komunikacji między aplikacją a interfejsem Play API. Aby używać tej klasy do zarządzania aktualizacjami w aplikacji, musisz ją najpierw uruchomić:

AppUpdateManager appUpdateManager = new AppUpdateManager();

Sprawdź dostępność aktualizacji

Zanim poprosisz o aktualizację, sprawdź, czy jest dostępna aktualizacja Twojej aplikacji. Użyj polecenia AppUpdateManager, by sprawdzić dostępność aktualizacji w korutynie:

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.
  }
}

Zwrócona instancja AppUpdateInfo zawiera stan dostępności aktualizacji. Jeśli trwa już aktualizacja w aplikacji, instancja informuje też o jej stanie.

Sprawdzanie braku aktualizacji aktualizacji

Oprócz sprawdzenia, czy jest dostępna aktualizacja, możesz też sprawdzić, ile czasu upłynęło od ostatniego powiadomienia użytkownika o niej w Sklepie Play. Pomoże Ci to zdecydować, czy należy przeprowadzić aktualizację elastyczną czy natychmiastową. Możesz na przykład odczekać kilka dni, zanim powiadomimy użytkownika o elastycznej aktualizacji, a potem kilka dni później.

Na stronie ClientVersionStalenessDays możesz sprawdzić, ile dni upłynęło od udostępnienia aktualizacji w Sklepie Play:

var stalenessDays = appUpdateInfoOperation.ClientVersionStalenessDays;

Sprawdź priorytet aktualizacji

Interfejs Google Play Developer API umożliwia określenie priorytetu każdej aktualizacji. Dzięki temu aplikacja może zdecydować, jak mocno zarekomendować użytkownikowi aktualizację. Oto przykładowa strategia ustawiania priorytetu aktualizacji:

  • Drobne ulepszenia interfejsu: aktualizacja o niskim priorytecie – nie żądaj ani elastycznej aktualizacji, ani natychmiastowej aktualizacji.
  • Ulepszenia wydajności: aktualizacja o średnim priorytecie; poproś o elastyczną aktualizację.
  • Krytyczna aktualizacja zabezpieczeń: aktualizacja o wysokim priorytecie; poproś o natychmiastową aktualizację.

Google Play określa priorytet przy użyciu liczby całkowitej z zakresu od 0 do 5, gdzie 0 to wartość domyślna, a 5 – najwyższy. Aby ustawić priorytet aktualizacji, użyj pola inAppUpdatePriority w polu Edits.tracks.releases w interfejsie Google Play Developer API. Wszystkie nowo dodane wersje w danej wersji mają ten sam priorytet. Priorytetu można ustawić tylko podczas wdrażania nowej wersji. Nie można go później zmienić.

Ustaw priorytet, korzystając z interfejsu Google Play Developer API, zgodnie z opisem w dokumentacji interfejsu Play Developer API. Priorytet aktualizacji w aplikacji należy określić w zasobie Edit.tracks przekazywanym w metodzie Edit.tracks: update. Ten przykład przedstawia publikowanie aplikacji z kodami wersji 88 i inAppUpdatePriority 5:

{
  "releases": [{
      "versionCodes": ["88"],
      "inAppUpdatePriority": 5,
      "status": "completed"
  }]
}

W kodzie aplikacji możesz sprawdzić priorytet danej aktualizacji za pomocą funkcji UpdatePriority:

var priority = appUpdateInfoOperation.UpdatePriority;

Rozpocznij aktualizację

Po upewnieniu się, że aktualizacja jest dostępna, możesz poprosić o jej aktualizację, korzystając z metody AppUpdateManager.StartUpdate(). Zanim poprosisz o aktualizację, sprawdź, czy masz aktualny obiekt AppUpdateInfo. Aby skonfigurować przepływ aktualizacji, musisz też utworzyć obiekt AppUpdateOptions.

Ten przykład tworzy obiekt AppUpdateOptions na potrzeby natychmiastowej aktualizacji:

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

Ten przykład tworzy obiekt AppUpdateOptions na potrzeby elastycznego przepływu aktualizacji:

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

Obiekt AppUpdateOptions zawiera też pole AllowAssetPackDeletion, które określa, czy aktualizacja może usuwać pakiety zasobów w przypadku ograniczonej pamięci urządzenia. To pole jest domyślnie ustawione na false, ale możesz przekazać opcjonalny argument allowAssetPackDeletion do ImmediateAppUpdateOptions() lub FlexibleAppUpdateOptions(), aby ustawić go na true:

// 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);

Kolejne kroki zależą od tego, czy prosisz o elastyczną aktualizację czy natychmiastową aktualizację.

Elastyczna aktualizacja

Gdy będziesz mieć aktualny obiekt AppUpdateInfo i poprawnie skonfigurowany obiekt AppUpdateOptions, możesz wywołać AppUpdateManager.StartUpdate(), aby asynchronicznie zażądać przepływu aktualizacji.

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;
  }

}

W przypadku elastycznego przepływu aktualizacji musisz aktywować jej instalację po pomyślnym ukończeniu pobierania. Aby to zrobić, wywołaj AppUpdateManager.CompleteUpdate(), jak w tym przykładzie:

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).
}

Natychmiastowa aktualizacja

Gdy będziesz mieć aktualny obiekt AppUpdateInfo i poprawnie skonfigurowany obiekt AppUpdateOptions, możesz wywołać AppUpdateManager.StartUpdate(), aby asynchronicznie zażądać przepływu aktualizacji.

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).
}

Aby przeprowadzić natychmiastową aktualizację, Google Play wyświetli okno z prośbą o potwierdzenie przez użytkownika. Gdy użytkownik zaakceptuje prośbę, Google Play automatycznie pobierze i zainstaluje aktualizację. Jeśli instalacja się powiedzie, aplikacja ponownie uruchomi się do zaktualizowanej wersji.

Obsługa błędów

W tej sekcji znajdziesz rozwiązania typowych błędów.

  • Jeśli StartUpdate() zwraca element ArgumentNullException, oznacza to, że AppUpdateInfo ma wartość null. Przed rozpoczęciem przepływu aktualizacji upewnij się, że obiekt AppUpdateInfo zwrócony z metody GetAppUpdateInfo() nie ma wartości null.
  • Jeśli PlayAsyncOperation zwraca kod błędu ErrorUpdateUnavailable, upewnij się, że dostępna jest zaktualizowana wersja aplikacji o tym samym identyfikatorze aplikacji i tym samym kluczu podpisywania.
  • Jeśli PlayAsyncOperation zwraca kod błędu ErrorUpdateNotAllowed, oznacza to, że obiekt AppUpdateOptions wskazuje typ aktualizacji, w przypadku którego dostępna aktualizacja jest niedozwolona. Przed rozpoczęciem procesu aktualizacji sprawdź, czy obiekt AppUpdateInfo wskazuje, że wybrany typ aktualizacji jest dozwolony.

Dalsze kroki

Przetestuj aktualizacje aplikacji, aby sprawdzić, czy integracja działa prawidłowo.