Obsługa aktualizacji w aplikacji (Unity)

Z tego przewodnika dowiesz się, jak obsługiwać aktualizacje w aplikacji w aplikacji korzystającej z Unity. Istnieją osobne przewodniki na potrzeby implementacji, które używają języka programowania Kotlin lub Java, oraz implementacji, które używają kodu natywnego (C/C++).

Konfigurowanie środowiska programistycznego

OpenUPM-CLI

Jeśli masz zainstalowany interfejs wiersza poleceń OpenUPM, możesz zainstalować rejestr OpenUPM za pomocą tego polecenia:

openupm add com.google.play.appupdate

OpenUPM

  1. Otwórz ustawienia menedżera pakietów, klikając opcję menu Unity Edytuj > Ustawienia projektu > Menedżer pakietów.

  2. Dodaj OpenUPM jako ograniczony rejestr do okna Menedżera pakietów:

    Name: package.openupm.com
    URL: https://package.openupm.com
    Scopes: com.google.external-dependency-manager
      com.google.play.common
      com.google.play.core
      com.google.play.appupdate
    
  3. Otwórz menu menedżera pakietów, wybierając w menu Unity opcję Okno > Menedżer pakietów.

  4. W menu zakresu menedżera wybierz Moje rejestry.

  5. Na liście pakietów wybierz pakiet Google Play Integrity plugin for Unity i kliknij Zainstaluj.

Importowanie z GitHuba

  1. Pobierz najnowszą wersję .unitypackage z GitHuba.

  2. Zaimportuj plik .unitypackage, wybierając opcję menu Unity Zasoby > Importuj pakiet > Własny pakiet i importując wszystkie elementy.

Omówienie pakietu Unity SDK

Interfejs API aktualizacji w aplikacji Play należy do rodziny pakietów SDK podstawowej biblioteki Play. Wtyczka Unity udostępnia klasę AppUpdateManager, która obsługuje komunikację między aplikacją a interfejsem Play API. Zanim zaczniesz używać tej klasy do zarządzania aktualizacjami w aplikacji, musisz utworzyć jej instancję:

AppUpdateManager appUpdateManager = new AppUpdateManager();

Sprawdzanie dostępności aktualizacji

Zanim poprosisz o aktualizację, sprawdź, czy jest dostępna aktualizacja aplikacji. Aby sprawdzić, czy w funkcji coroutine jest dostępna aktualizacja, użyj funkcji AppUpdateManager:

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 aktualizacja w aplikacji jest już w toku, instancja również podaje stan tej aktualizacji.

Sprawdzanie aktualności aktualizacji

Oprócz sprawdzenia, czy jest dostępna aktualizacja, warto też sprawdzić, ile czasu minęło od ostatniego powiadomienia o aktualizacji w Sklepie Play. Pomoże Ci to zdecydować, czy chcesz przeprowadzić elastyczne, czy natychmiastowe wprowadzenie zmian. Możesz na przykład poczekać kilka dni, zanim powiadomisz użytkownika o możliwości aktualizacji, a po kilku kolejnych dniach poprosisz o natychmiastową aktualizację.

Użyj ClientVersionStalenessDays, aby sprawdzić, ile dni minęło od udostępnienia aktualizacji w Sklepie Play:

var stalenessDays = appUpdateInfoOperation.ClientVersionStalenessDays;

Sprawdzanie priorytetu aktualizacji

Interfejs Google Play Developer API umożliwia ustawienie priorytetu każdej aktualizacji. Dzięki temu aplikacja może określić, jak mocno zalecić użytkownikowi aktualizację. Rozważ na przykład tę strategię ustawiania priorytetu aktualizacji:

  • Niewielkie ulepszenia interfejsu: aktualizacja o niskim priorytecie; nie żądaj elastycznej aktualizacji ani natychmiastowej aktualizacji.
  • Ulepszenia dotyczące wydajności: aktualizacja o średnim priorytecie; poproś o elastyczne aktualizacje.
  • Niezbędna aktualizacja zabezpieczeń: wysoki priorytet; zalecana natychmiastowa aktualizacja.

Aby określić priorytet, Google Play używa liczby całkowitej z zakresu od 0 do 5, gdzie 0 jest domyślną wartością, a 5 – najwyższym priorytetem. Aby ustawić priorytet aktualizacji, użyj pola inAppUpdatePriority w sekcji Edits.tracks.releases w interfejsie Google Play Developer API. Wszystkie nowo dodane wersje w ramach danej wersji mają ten sam priorytet. Priorytet można ustawić tylko podczas wdrażania nowej wersji. Nie można go zmienić w późniejszym czasie.

Ustaw priorytet za pomocą interfejsu Google Play Developer API zgodnie z opisem w dokumentacji interfejsu Play Developer API. Priorytet aktualizacji w aplikacji powinien być określony w zasobie Edit.tracks przekazanym w ramach metody Edit.tracks: update. Ten przykład pokazuje, jak wydać aplikację z kodem wersji 88 i inAppUpdatePriority 5:

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

W kodzie aplikacji możesz sprawdzić poziom priorytetu danej aktualizacji za pomocą UpdatePriority:

var priority = appUpdateInfoOperation.UpdatePriority;

Rozpoczynanie aktualizacji

Po sprawdzeniu, czy aktualizacja jest dostępna, możesz poprosić o jej zainstalowanie, korzystając z AppUpdateManager.StartUpdate(). Zanim poprosisz o aktualizację, upewnij się, że masz aktualny obiekt AppUpdateInfo. Aby skonfigurować proces aktualizacji, musisz też utworzyć obiekt AppUpdateOptions.

W tym przykładzie tworzymy obiekt AppUpdateOptions do natychmiastowego procesu aktualizacji:

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

Ten przykład tworzy obiekt AppUpdateOptions w ramach elastycznego procesu 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 wyczyścić pakiety zasobów w przypadku ograniczonej ilości miejsca na urządzeniu. To pole ma domyślnie wartość false, ale możesz przekazać opcjonalny argument allowAssetPackDeletion do argumentu ImmediateAppUpdateOptions() lub FlexibleAppUpdateOptions(), aby zamiast tego ustawić wartość 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);

Dalsze czynności zależą od tego, czy żądasz elastycznej aktualizacji, czy natychmiastowej aktualizacji.

Obsługa elastycznej aktualizacji

Gdy masz aktualny obiekt AppUpdateInfo i prawidłowo skonfigurowany obiekt AppUpdateOptions, możesz wywołać funkcję AppUpdateManager.StartUpdate(), aby asynchronicznie poprosić o przeprowadzenie procesu 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;
  }

}

Aby umożliwić elastyczny proces aktualizacji, musisz wywołać instalację aktualizacji aplikacji po zakończeniu pobierania. Aby to zrobić, wywołaj funkcję 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).
}

Przeprowadzanie natychmiastowej aktualizacji

Gdy masz aktualny obiekt AppUpdateInfo i prawidłowo skonfigurowany obiekt AppUpdateOptions, możesz wywołać funkcję AppUpdateManager.StartUpdate(), aby asynchronicznie poprosić o przeprowadzenie procesu 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).
}

W przypadku natychmiastowej aktualizacji Google Play wyświetla użytkownikowi okno potwierdzenia. Gdy użytkownik zaakceptuje prośbę, Google Play automatycznie pobierze i zainstaluje aktualizację, a następnie uruchomi zaktualizowaną wersję aplikacji.

Obsługa błędów

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

  • Jeśli funkcja StartUpdate() zwraca wartość ArgumentNullException, oznacza to, że AppUpdateInfo ma wartość null. Zanim rozpoczniesz proces aktualizacji, upewnij się, że obiekt AppUpdateInfo zwracany przez funkcję GetAppUpdateInfo() nie jest pusty.
  • Jeśli PlayAsyncOperation zwraca kod błędu ErrorUpdateUnavailable, sprawdź, czy dostępna jest zaktualizowana wersja aplikacji z tym samym identyfikatorem aplikacji i tym samym kluczem podpisywania.
  • Jeśli PlayAsyncOperation zwróci kod błędu ErrorUpdateNotAllowed, oznacza to, że obiekt AppUpdateOptions wskazuje typ aktualizacji, który nie jest dozwolony w przypadku dostępnej aktualizacji. Przed rozpoczęciem przepływu aktualizacji sprawdź, czy obiekt AppUpdateInfo wskazuje, że wybrany typ aktualizacji jest dozwolony.

Dalsze kroki

Sprawdź aktualizacje w aplikacji, aby upewnić się, że integracja działa prawidłowo.