Uygulama içi güncellemeleri destekleme (Kotlin veya Java)

Bu kılavuzda, uygulama içi reklamların güncellemelerini kullanarak Java. Uygulamanızda yerel kodun kullanıldığı durumlar için ayrı kılavuzlar vardır (C/C++) ile uygulama Unity'yi kullanır.

Geliştirme ortamınızı ayarlama

Play Uygulama İçi Güncelleme Kitaplığı, Google Play Core kitaplıklarının bir parçasıdır. Play Uygulama İçi'ni entegre etmek için lütfen aşağıdaki Gradle bağımlılığını ekleyin Kitaplığı Güncelle'yi tıklayın.

Eski

// In your app’s build.gradle file:
...
dependencies {
    // This dependency is downloaded from the Google’s Maven repository.
    // So, make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.play:app-update:2.1.0'

    // For Kotlin users also add the Kotlin extensions library for Play In-App Update:
    implementation 'com.google.android.play:app-update-ktx:2.1.0'
    ...
}

Kotlin

// In your app’s build.gradle.kts file:
...
dependencies {
    // This dependency is downloaded from the Google’s Maven repository.
    // So, make sure you also include that repository in your project's build.gradle file.
    implementation("com.google.android.play:app-update:2.1.0")

    // For Kotlin users also import the Kotlin extensions library for Play In-App Update:
    implementation("com.google.android.play:app-update-ktx:2.1.0")
    ...
}

Güncelleme kullanılabilirliğini kontrol etme

Güncelleme isteğinde bulunmadan önce uygulamanız için bir güncelleme olup olmadığını kontrol edin. Tekliflerinizi otomatikleştirmek ve optimize etmek için AppUpdateManager bir güncelleme olup olmadığını kontrol etmek için:

Kotlin

val appUpdateManager = AppUpdateManagerFactory.create(context)

// Returns an intent object that you use to check for an update.
val appUpdateInfoTask = appUpdateManager.appUpdateInfo

// Checks that the platform will allow the specified type of update.
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
        // This example applies an immediate update. To apply a flexible update
        // instead, pass in AppUpdateType.FLEXIBLE
        && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
    ) {
        // Request the update.
    }
}

Java

AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(context);

// Returns an intent object that you use to check for an update.
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();

// Checks that the platform will allow the specified type of update.
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
          // This example applies an immediate update. To apply a flexible update
          // instead, pass in AppUpdateType.FLEXIBLE
          && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
              // Request the update.
    }
});

Döndürülen AppUpdateInfo örneği, güncelleme kullanılabilirlik durumunu içerir. Görevin durumuna bağlı olarak güncellemeniz, örnek aşağıdakileri de içerir:

  • Bir güncelleme varsa ve güncellemeye izin veriliyorsa bu örneğe de güncellemeyi başlatma isteği içerir.
  • Devam eden bir uygulama içi güncelleme varsa örnek ayrıca devam eden güncellemenin durumu.

Güncelleme eskiliğini kontrol etme

Bir güncelleme olup olmadığını kontrol etmenin yanı sıra, kullanıcıya bir güncellemenin bildirilmesinden bu yana ne kadar süre geçtiğini kontrol etme Play Store üzerinden satın alabilirsiniz. Bu, bir risk yönetimi planı başlatmanız gerekip gerekmediğine Esnek güncelleme veya anında güncelleme. Örneğin, proje ekibinin Kullanıcıya esnek bir güncellemeyle bildirmeden önce ve bunun ardından birkaç gün ve hemen bir güncelleme gerektirmeden çalışır.

Tekliflerinizi otomatikleştirmek ve optimize etmek için clientVersionStalenessDays() güncellemenin Play Store'da kullanıma sunulmasından bu yana geçen gün sayısını kontrol etmek için:

Kotlin

val appUpdateManager = AppUpdateManagerFactory.create(context)

// Returns an intent object that you use to check for an update.
val appUpdateInfoTask = appUpdateManager.appUpdateInfo

// Checks whether the platform allows the specified type of update,
// and current version staleness.
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
          && (appUpdateInfo.clientVersionStalenessDays() ?: -1) >= DAYS_FOR_FLEXIBLE_UPDATE
          && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
              // Request the update.
    }
}

Java

AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(context);

// Returns an intent object that you use to check for an update.
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();

// Checks whether the platform allows the specified type of update,
// and current version staleness.
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
          && appUpdateInfo.clientVersionStalenessDays() != null
          && appUpdateInfo.clientVersionStalenessDays() >= DAYS_FOR_FLEXIBLE_UPDATE
          && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
              // Request the update.
    }
});

Güncelleme önceliğini kontrol edin

Google Play Developer API, her güncellemenin önceliğini belirlemenize olanak tanır. Bu, uygulamanızın kullanıcıya ne kadar önemli bir güncelleme önereceğine karar vermesine olanak tanır. Örneğin, güncelleme önceliğini ayarlamak için aşağıdaki stratejiyi göz önünde bulundurun:

  • Kullanıcı arayüzünde küçük iyileştirmeler: Düşük öncelikli güncelleme; ne esnek ne de veya hemen bir güncelleme olması gerekir. Yalnızca kullanıcı etkileşim kurmadığında güncelle nasıl sağlayabileceğini de öğreneceksiniz.
  • Performans iyileştirmeleri: Orta öncelikli güncelleme; esnek bir şekilde güncelleyin.
  • Kritik güvenlik güncellemesi: Yüksek öncelikli güncelleme; derhal istekte bulunma güncelleyin.

Google Play, önceliği belirlemek için 0 ile 5 arasında bir tam sayı değeri (0) kullanır 5 en yüksek önceliğe sahiptir. Bir güncellemek için Edits.tracks.releases altındaki inAppUpdatePriority alanını kullanın Google Play Geliştirici API'si. Bu sürüme eklenen tüm yeni sürümler yayınla aynı önceliğe sahip olduğunu kabul eder. Öncelik yalnızca şu durumlarda ayarlanabilir: ve daha sonra değiştirilemez.

Önceliği Google Play Geliştirici API'sini kullanarak Play Geliştirici API'sı dokümanlarına göz atın. Uygulama içi güncelleme önceliği Edit.tracks kaynak Edit.tracks: update yöntemidir. Aşağıdaki örnekte, sürüm kodu 88 olan bir uygulamanın yayınlanması gösterilmektedir ve inAppUpdatePriority 5:

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

Uygulamanızın kodunda, belirli bir güncellemenin öncelik düzeyini kontrol etmek için aşağıdakileri kullanabilirsiniz: updatePriority(). Döndürülen öncelik, tüm uygulamalar için inAppUpdatePriority dikkate alır sürüm kodlarını yüklü sürüm ile mevcut en son sürüm arasında, sürüm kanalından bağımsız olarak ekleyebilirsiniz. Örneğin, aşağıdaki senaryoyu inceleyin:

  • Sürüm 1'i önceliği olmayan bir üretim kanalına yayınlarsınız.
  • Sürüm 2'yi önceliği 5 olan dahili test kanalına yayınlarsınız.
  • Sürüm 3'ü önceliği olmayan bir üretim kanalına yayınlarsınız.

Üretim kullanıcıları sürüm 1'den sürüm 3'e güncelleme yaptıklarında öncelik kazanırlar 5.000'den fazla yayınlanamıyor.

Kotlin

val appUpdateManager = AppUpdateManagerFactory.create(context)

// Returns an intent object that you use to check for an update.
val appUpdateInfoTask = appUpdateManager.appUpdateInfo

// Checks whether the platform allows the specified type of update,
// and checks the update priority.
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
          && appUpdateInfo.updatePriority() >= 4 /* high priority */
          && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
              // Request an immediate update.
    }
}

Java

AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(context);

// Returns an intent object that you use to check for an update.
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();

// Checks whether the platform allows the specified type of update,
// and checks the update priority.
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
          && appUpdateInfo.updatePriority() >= 4 /* high priority */
          && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
              // Request an immediate update.
    }
});

Güncelleme başlatın

Bir güncellemenin olduğunu onayladıktan sonra, şunu kullanarak güncelleme isteğinde bulunabilirsiniz: AppUpdateManager.startUpdateFlowForResult():

Kotlin

appUpdateManager.startUpdateFlowForResult(
    // Pass the intent that is returned by 'getAppUpdateInfo()'.
    appUpdateInfo,
    // an activity result launcher registered via registerForActivityResult
    activityResultLauncher,
    // Or pass 'AppUpdateType.FLEXIBLE' to newBuilder() for
    // flexible updates.
    AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build())

Java

appUpdateManager.startUpdateFlowForResult(
    // Pass the intent that is returned by 'getAppUpdateInfo()'.
    appUpdateInfo,
    // an activity result launcher registered via registerForActivityResult
    activityResultLauncher,
    // Or pass 'AppUpdateType.FLEXIBLE' to newBuilder() for
    // flexible updates.
    AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build());

Her AppUpdateInfo örneği yalnızca bir kez güncelleme başlatmak için kullanılabilir. Yeniden denemek için Hata durumunda güncellemeyi tekrar deneyin, yeni bir AppUpdateInfo isteyin ve tekrar kontrol edin ve izin verildiğini belirtmeniz gerekir.

Bir etkinlik sonucu başlatıcıyı yerleşik olarak bulunan ActivityResultContracts.StartIntentSenderForResult sözleşme imzalamaz. Şu bölüme bakın: güncelleme durumu için geri aranma.

Sonraki adımlar, esnek teklif isteğinde bulunup bulunmadığınıza bir güncelleme veya anında güncelleme yapılması gerekir.

AppUpdateOptions ile güncelleme yapılandırma

AppUpdateOptions güncellemenin yapılıp yapılmadığını tanımlayan bir AllowAssetPackDeletion alanı içerir öğe paketlerini temizlemenize izin verildiğinden sınırlı cihaz depolama alanı. Bu alan varsayılan olarak false değerine ayarlıdır ancak setAllowAssetPackDeletion() yöntemini kullanarak bunu true olarak ayarlayın:

Kotlin

appUpdateManager.startUpdateFlowForResult(
    // Pass the intent that is returned by 'getAppUpdateInfo()'.
    appUpdateInfo,
    // an activity result launcher registered via registerForActivityResult
    activityResultLauncher,
    // Or pass 'AppUpdateType.FLEXIBLE' to newBuilder() for
    // flexible updates.
    AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE)
        .setAllowAssetPackDeletion(true)
        .build())

Java

appUpdateManager.startUpdateFlowForResult(
    // Pass the intent that is returned by 'getAppUpdateInfo()'.
    appUpdateInfo,
    // an activity result launcher registered via registerForActivityResult
    activityResultLauncher,
    // Or pass 'AppUpdateType.FLEXIBLE' to newBuilder() for
    // flexible updates.
    AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE)
        .setAllowAssetPackDeletion(true)
        .build());

Güncelleme durumu için geri aranma

Bir güncelleme başlatıldıktan sonra, kayıtlı etkinlik sonucu başlatıcı geri çağırması şunu alır: onay iletişim kutusu sonucu:

Kotlin

registerForActivityResult(StartIntentSenderForResult()) { result: ActivityResult ->
    // handle callback
    if (result.resultCode != RESULT_OK) {
        log("Update flow failed! Result code: " + result.resultCode);
        // If the update is canceled or fails,
        // you can request to start the update again.
    }
}

Java

registerForActivityResult(
    new ActivityResultContracts.StartIntentSenderForResult(),
    new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            // handle callback
            if (result.getResultCode() != RESULT_OK) {
                log("Update flow failed! Result code: " + result.getResultCode());
                // If the update is canceled or fails,
                // you can request to start the update again.
            }
        }
    });

onActivityResult() ürününden alabileceğiniz birkaç değer vardır. geri arama:

  • RESULT_OK: Kullanıcı güncellemeyi kabul etti. Anlık güncellemeler için bu mesajı alamayabilirsiniz geri çağırın. Bunun nedeni, güncellemenin saat denetiminin en iyi uygulamaları paylaşacağız.
  • RESULT_CANCELED: Kullanıcı , güncellemeyi reddetti veya iptal etti.
  • ActivityResult.RESULT_IN_APP_UPDATE_FAILED: Başka bir hata, kullanıcının izin vermesini veya bu güncellemenin devamını getiremez.

Esnek güncellemeleri yönetme

Esnek güncelleme başlattığınızda, istekte bulunması için ilk olarak kullanıcıya bir iletişim kutusu gösterilir. izin verin. Kullanıcı izin verirse indirme işlemi arka planda başlar ve Kullanıcı uygulamanızla etkileşimde bulunmaya devam edebilir. Bu bölümde, projenizin Esnek uygulama içi güncellemeyi izleyip tamamlayın.

Esnek güncelleme durumunu izleme

Esnek güncelleme için indirme işlemi başladıktan sonra, uygulamanızın durumu güncellemek ve güncellemenin ne zaman yüklenebileceğini öğrenmek ve ilerleme durumunu kontrol edebilirsiniz.

Devam eden bir güncellemenin durumunu izlemek için bir işleyiciyi yükleme durumu güncellemeleri. Ayrıca aşağıdakileri yapmak için uygulamanın kullanıcı arayüzünde bir ilerleme çubuğu sağlayabilirsiniz: Kullanıcıları indirme işleminin devam ettiği konusunda bilgilendirin.

Kotlin

// Create a listener to track request state updates.
val listener = InstallStateUpdatedListener { state ->
    // (Optional) Provide a download progress bar.
    if (state.installStatus() == InstallStatus.DOWNLOADING) {
      val bytesDownloaded = state.bytesDownloaded()
      val totalBytesToDownload = state.totalBytesToDownload()
      // Show update progress bar.
    }
    // Log state or install the update.
}

// Before starting an update, register a listener for updates.
appUpdateManager.registerListener(listener)

// Start an update.

// When status updates are no longer needed, unregister the listener.
appUpdateManager.unregisterListener(listener)

Java

// Create a listener to track request state updates.
InstallStateUpdatedListener listener = state -> {
  // (Optional) Provide a download progress bar.
  if (state.installStatus() == InstallStatus.DOWNLOADING) {
      long bytesDownloaded = state.bytesDownloaded();
      long totalBytesToDownload = state.totalBytesToDownload();
      // Implement progress bar.
  }
  // Log state or install the update.
};

// Before starting an update, register a listener for updates.
appUpdateManager.registerListener(listener);

// Start an update.

// When status updates are no longer needed, unregister the listener.
appUpdateManager.unregisterListener(listener);

Esnek güncellemeyi yükleme

InstallStatus.DOWNLOADED durumunu algıladığında cihazı yeniden başlatmanız gerekir. uygulamasını kullanın.

Anında güncellemelerden farklı olarak Google Play, uygulamaları otomatik olarak tetiklemez yeniden başlatabilirsiniz. Bunun nedeni, esnek güncelleme sırasında Kullanıcı, karar verene kadar uygulamayla etkileşim kurmaya devam etmeyi beklemektedir. güncellemeyi kabul etmeleri gerekir.

Bir bildirim (veya başka bir kullanıcı arayüzü göstergesi) sağlamanız önerilir Güncellemenin yüklenmeye hazır olduğunu kullanıcıya bildirmek ve onay istemek için ve uygulamayı yeniden başlatmadan önce kontrol edin.

Aşağıdaki örnekte, bir Materyal Tasarım'ın uygulanması istekte bulunan atıştırmalık çubuğu uygulamanın yeniden başlatılması için kullanıcıdan onay:

Kotlin

val listener = { state ->
    if (state.installStatus() == InstallStatus.DOWNLOADED) {
        // After the update is downloaded, show a notification
        // and request user confirmation to restart the app.
        popupSnackbarForCompleteUpdate()
    }
    ...
}

// Displays the snackbar notification and call to action.
fun popupSnackbarForCompleteUpdate() {
    Snackbar.make(
        findViewById(R.id.activity_main_layout),
        "An update has just been downloaded.",
        Snackbar.LENGTH_INDEFINITE
    ).apply {
        setAction("RESTART") { appUpdateManager.completeUpdate() }
        setActionTextColor(resources.getColor(R.color.snackbar_action_text_color))
        show()
    }
}

Java

InstallStateUpdatedListener listener = state -> {
    if (state.installStatus() == InstallStatus.DOWNLOADED) {
        // After the update is downloaded, show a notification
        // and request user confirmation to restart the app.
        popupSnackbarForCompleteUpdate();
    }
    ...
};

// Displays the snackbar notification and call to action.
private void popupSnackbarForCompleteUpdate() {
  Snackbar snackbar =
      Snackbar.make(
          findViewById(R.id.activity_main_layout),
          "An update has just been downloaded.",
          Snackbar.LENGTH_INDEFINITE);
  snackbar.setAction("RESTART", view -> appUpdateManager.completeUpdate());
  snackbar.setActionTextColor(
      getResources().getColor(R.color.snackbar_action_text_color));
  snackbar.show();
}

Aradığınızda appUpdateManager.completeUpdate() Ön planda, platformda uygulamayı yeniden başlatan tam ekran bir kullanıcı arayüzü görüntülenir. arka planda çalışır. Platform, güncellemeyi yükledikten sonra, uygulamanız ana faaliyeti.

Bunun yerine, uygulamanız completeUpdate() arka plan kullanıyorsanız güncelleme sessizce yüklenir. cihazın kullanıcı arayüzünü engellemeden uygulamanızı sağlar.

Kullanıcı uygulamanızı ön plana her getirdiğinde, uygulamanızın yüklenmeyi bekleyen bir güncelleme var. Uygulamanızın DOWNLOADED içinde bir güncellemesi varsa durum, kullanıcıdan güncellemeyi yüklemesini isteyin. Aksi halde, güncelleme verileri Kullanıcının cihaz depolama alanını kullanmaya devam eder.

Kotlin

// Checks that the update is not stalled during 'onResume()'.
// However, you should execute this check at all app entry points.
override fun onResume() {
    super.onResume()

    appUpdateManager
        .appUpdateInfo
        .addOnSuccessListener { appUpdateInfo ->
            ...
            // If the update is downloaded but not installed,
            // notify the user to complete the update.
            if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
                popupSnackbarForCompleteUpdate()
            }
        }
}

Java

// Checks that the update is not stalled during 'onResume()'.
// However, you should execute this check at all app entry points.
@Override
protected void onResume() {
  super.onResume();

  appUpdateManager
      .getAppUpdateInfo()
      .addOnSuccessListener(appUpdateInfo -> {
              ...
              // If the update is downloaded but not installed,
              // notify the user to complete the update.
              if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
                  popupSnackbarForCompleteUpdate();
              }
          });
}

Anlık güncelleme yapma

Anında bir güncelleme başlattığınızda ve kullanıcı güncellemenin başlatılmasına izin verdiğinde Google Play, süreç boyunca güncelleme ilerleme durumunu uygulamanızın kullanıcı arayüzünün üst kısmında güncelleme süresi boyunca geçerli olur. Kullanıcı, yükleme sırasında uygulamanızı kapatırsa Güncelleme, arka planda indirilmeye ve yüklenmeye devam edecektir. başka bir kullanıcı onayı olmadan kullanılabilir.

Ancak, uygulamanız ön plana geri döndüğünde durumunda kesinti olup olmadığını UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS durumu. Güncelleme bu durumda kaldıysa güncellemeyi devam ettirin:

Kotlin

// Checks that the update is not stalled during 'onResume()'.
// However, you should execute this check at all entry points into the app.
override fun onResume() {
    super.onResume()

    appUpdateManager
        .appUpdateInfo
        .addOnSuccessListener { appUpdateInfo ->
            ...
            if (appUpdateInfo.updateAvailability()
                == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
            ) {
                // If an in-app update is already running, resume the update.
                appUpdateManager.startUpdateFlowForResult(
                  appUpdateInfo,
                  activityResultLauncher,
                  AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build())
            }
        }
}

Java

// Checks that the update is not stalled during 'onResume()'.
// However, you should execute this check at all entry points into the app.
@Override
protected void onResume() {
  super.onResume();

  appUpdateManager
      .getAppUpdateInfo()
      .addOnSuccessListener(
          appUpdateInfo -> {
            ...
            if (appUpdateInfo.updateAvailability()
                == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
                // If an in-app update is already running, resume the update.
                appUpdateManager.startUpdateFlowForResult(
                  appUpdateInfo,
                  activityResultLauncher,
                  AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build());
            }
          });
}

Güncelleme akışı, web sitesinin referans belgelerinde açıklandığı gibi startUpdateFlowForResult() oluşturun. Uygulamanız özellikle, bir kullanıcının indirme işlemini günceller veya iptal eder. Kullanıcı bu işlemlerden birini gerçekleştirdiğinde Google Play kullanıcı arayüzü kapanıyor. Uygulamanız, devam etmek için en iyi yöntemi belirlemelidir.

Mümkünse kullanıcının güncelleme yapmadan devam etmesine izin verin ve tekrar isteyin daha sonra. Uygulamanız güncelleme olmadan çalışamıyorsa, başlatmadan önce veya kullanıcıdan yeniden başlatmasını istemeden önce bilgilendirme mesajı uygulamayı kapatın. Bu şekilde, kullanıcı uygulamanızı yeniden başlatabileceğini anlar .

Sonraki adımlar

Doğrulamak için uygulamanızın uygulama içi güncellemelerini test edin doğru çalıştığından emin olun.