Bu kılavuzda, Kotlin veya Java kullanarak uygulamanızda uygulama içi güncellemeleri nasıl destekleyeceğiniz açıklanmaktadır. Uygulamanızın doğal kod (C/C++) kullandığı durumlar ve uygulamanızın Unity kullandığı durumlar için ayrı kılavuzlar vardı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 Güncelleme Kitaplığı'nı entegre etmek için lütfen aşağıdaki Gradle bağımlılığını ekleyin.
Groovy
// 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 olup olmadığını kontrol etme
Güncelleme isteğinde bulunmadan önce uygulamanız için güncelleme olup olmadığını kontrol edin. Güncelleme olup olmadığını kontrol etmek için AppUpdateManager
simgesini kullanın:
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üncellemenin durumuna bağlı olarak ö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 bilgilendirmeden önce ve bundan birkaç gün sonra ve hemen bir güncelleme gerektirmeden çalışır.
Güncellemenin Play Store'da kullanıma sunulmasından bu yana geçen gün sayısını kontrol etmek için clientVersionStalenessDays()
simgesini kullanın:
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 ayarlamanıza olanak tanır. Bu sayede uygulamanız, kullanıcıya güncellemeyi ne kadar güçlü bir şekilde önereceğine karar verebilir. Örneğin, güncelleme önceliğini belirlemek için aşağıdaki stratejiyi kullanabilirsiniz:
- 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ı uygulamanızla etkileşimde değilken güncelleyin.
- 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üncellemenin önceliğini ayarlamak için Google Play Developer API'de Edits.tracks.releases
altındaki inAppUpdatePriority
alanını kullanın. Sürüme yeni eklenen tüm sürümlerin önceliği, sürümle aynı kabul edilir. Öncelik yalnızca yeni bir sürüm kullanıma sunulduğunda belirlenebilir 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 ve inAppUpdatePriority
5 olan bir uygulamanın yayınlanması gösterilmektedir:
{ "releases": [{ "versionCodes": ["88"], "inAppUpdatePriority": 5, "status": "completed" }] }
Uygulamanızın kodunda, updatePriority()
kullanarak belirli bir güncellemenin öncelik düzeyini kontrol edebilirsiniz.
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,
her biri sürüm kanalından bağımsız olarak yapılır. Ö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.
- 3. sürümü, önceliği olmayan bir üretim kanalında yayınlarsınız.
Üretim kullanıcıları 1. sürümden 3. sürüme güncellendiğinde, 2. sürüm farklı bir kanalda yayınlanmış olsa bile öncelik 5'i alırlar.
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
Güncelleme olduğunu onayladıktan sonra AppUpdateManager.startUpdateFlowForResult()
simgesini kullanarak güncelleme isteğinde bulunabilirsiniz:
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, güncelleme başlatmak için yalnızca bir kez kullanılabilir. Başarısızlık durumunda güncellemeyi yeniden denemek için yeni bir AppUpdateInfo
isteyin ve güncellemenin kullanılabilir olup olmadığını ve izin verilip verilmediğini tekrar kontrol edin.
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
olarak ayarlanmıştır ancak setAllowAssetPackDeletion()
yöntemini kullanarak true
olarak ayarlayabilirsiniz:
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()
callback'inden alabileceğiniz birkaç değer vardır:
RESULT_OK
: Kullanıcı güncellemeyi kabul etti. Kontrol uygulamanıza geri verildiğinde güncelleme zaten tamamlanmış olacağından anında güncellemeler için bu geri çağırma çağrısını alamayabilirsiniz.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üncellemeyi işleme
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 indirilmeye başladıktan sonra uygulamanızın, güncellemenin ne zaman yüklenebileceğini öğrenmek ve ilerleme durumunu uygulamanızın kullanıcı arayüzünde görüntülemek için güncelleme durumunu izlemesi gerekir.
Devam eden bir güncellemenin durumunu izlemek için bir işleyiciyi yükleme durumu güncellemeleri. Ayrıca, kullanıcıları indirme işleminin ilerleme durumundan haberdar etmek için uygulamanın kullanıcı arayüzünde bir ilerleme çubuğu da sağlayabilirsiniz.
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 tespit ettiğinizde güncellemeyi yüklemek için uygulamayı yeniden başlatmanız gerekir.
Anında güncellemelerin aksine Google Play, esnek güncelleme için uygulamayı otomatik olarak yeniden başlatmaz. 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, uygulamayı yeniden başlatmak için kullanıcıdan onay isteyen bir Materyal Tasarım bilgi çubuğu'nun uygulanması gösterilmektedir:
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 arka plandayken completeUpdate()
işlevini çağırırsanız güncelleme, cihaz kullanıcı arayüzünü gizlemeden sessizce yüklenir.
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 takdirde, güncelleme verileri kullanıcının cihaz depolama alanında yer almaya 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ı güncelleme sırasında uygulamanızı kapatırsa veya sonlandırırsa güncelleme, ek kullanıcı onayı olmadan arka planda indirilip yüklenmeye devam eder.
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 durmuşsa 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ışı, startUpdateFlowForResult() işlevinin referans dokümanlarında açıklandığı şekilde bir sonuç döndürür. Özellikle, uygulamanız bir kullanıcının güncellemeyi reddetmesi veya indirme işlemini iptal etmesi gibi durumları ele alabilmelidir. Kullanıcı bu işlemlerden birini gerçekleştirdiğinde Google Play kullanıcı arayüzü kapanır. Devam etmenin en iyi yolunu uygulamanız 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.