Menjaga aplikasi Anda selalu terupdate di perangkat pengguna memungkinkan mereka mencoba fitur-fitur terbaru, serta mendapat manfaat dari peningkatan performa dan perbaikan bug. Meskipun beberapa pengguna mengaktifkan update latar belakang jika perangkat terhubung ke koneksi tidak berbayar, pengguna lain mungkin perlu diingatkan untuk mengupdate. Update dalam aplikasi adalah fitur library Play Core yang memperkenalkan aliran permintaan baru untuk meminta pengguna aktif mengupdate aplikasi Anda.
Update dalam aplikasi hanya berfungsi pada perangkat yang menjalankan Android 5.0 (API level 21) atau yang lebih tinggi, dan mengharuskan Anda untuk menggunakan library Play Core 1.5.0 atau yang lebih tinggi. Selain itu, update dalam aplikasi hanya mendukung aplikasi yang berjalan di perangkat seluler dan tablet Android, serta perangkat Chrome OS.
Setelah memenuhi persyaratan berikut, aplikasi Anda dapat mendukung UX berikut untuk update dalam aplikasi:
Fleksibel: Pengalaman pengguna yang menyediakan download latar belakang dan penginstalan dengan pemantauan status yang rapi. UX ini cocok ketika pengguna diperbolehkan untuk menggunakan aplikasi saat mendownload update. Misalnya, Anda ingin mendorong pengguna untuk mencoba fitur baru yang tidak terlalu penting untuk fungsi inti dari aplikasi Anda.
Gambar 1. Contoh alur update yang fleksibel
Langsung: Pengalaman pengguna layar penuh yang mewajibkan pengguna untuk mengupdate dan memulai ulang aplikasi untuk terus menggunakan aplikasi tersebut. UX ini adalah pilihan terbaik untuk kasus di mana update menjadi sangat penting agar aplikasi dapat terus digunakan. Setelah pengguna menerima update langsung, Google Play menangani penginstalan update dan aplikasi dimulai ulang.
Gambar 2. Contoh alur update langsung
Halaman ini menunjukkan kepada Anda cara menggunakan library Play Core untuk meminta dan melakukan update dalam aplikasi langsung atau fleksibel.
Memeriksa ketersediaan update
Sebelum meminta update, Anda perlu memeriksa terlebih dahulu apakah update tersedia untuk aplikasi Anda. Untuk memeriksa update, gunakan
AppUpdateManager
,
seperti yang ditunjukkan pada bagian berikut:
Kotlin
// Creates instance of the manager. 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 // For a flexible update, use AppUpdateType.FLEXIBLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { // Request the update. } }
Java
// Creates instance of the manager. 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 // For a flexible update, use AppUpdateType.FLEXIBLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { // Request the update. } });
Hasilnya berisi status ketersediaan update. Jika update tersedia dan update diizinkan, AppUpdateInfo
yang ditampilkan juga berisi intent untuk memulai update. Lihat bagian berikut untuk mengetahui cara memulai update.
Jika update dalam aplikasi sedang berlangsung, hasilnya juga akan melaporkan status dari update yang sedang berlangsung.
Periksa penghentian update
Selain memeriksa apakah update tersedia, sebaiknya periksa juga jumlah waktu yang telah berlalu sejak pengguna diberi tahu tentang update melalui Google Play Store. Ini, misalnya, dapat membantu Anda memutuskan apakah aplikasi Anda harus memulai update yang fleksibel atau langsung. Artinya, Anda mungkin ingin menunggu beberapa hari sebelum memberi tahu pengguna dengan update yang fleksibel, dan beberapa hari setelahnya sebelum meminta update langsung.
Untuk memeriksa jumlah hari yang telah berlalu sejak Google Play Store mempelajari update, gunakan clientVersionStalenessDays()
, seperti yang ditunjukkan:
Kotlin
// Creates instance of the manager. 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 { if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.clientVersionStalenessDays() != null && appUpdateInfo.clientVersionStalenessDays() >= DAYS_FOR_FLEXIBLE_UPDATE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) { // Request the update. }
Java
// Creates instance of the manager. 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. } });
Periksa prioritas update
Dengan Google Play Developer API, Anda dapat menyetel prioritas setiap update. Hal ini memungkinkan aplikasi Anda menentukan seberapa kuat rekomendasi update kepada pengguna. Sebagai contoh, pertimbangkan strategi berikut untuk menyetel prioritas update:
- Peningkatan UI kecil: Update prioritas rendah; meminta update yang tidak fleksibel atau langsung.
- Peningkatan performa: Update Prioritas sedang; meminta update fleksibel.
- Update keamanan penting: Update Prioritas tinggi; memerlukan update langsung.
Untuk menentukan prioritas, Google Play menggunakan nilai bilangan bulat antara 0 dan 5, dengan 0 sebagai nilai default, dan 5 menjadi prioritas tertinggi. Untuk menyetel prioritas update, gunakan bidang inAppUpdatePriority
di bawah Edits.tracks.releases
pada Google Play Developer API. Semua versi yang baru ditambahkan dalam rilis akan dianggap sebagai prioritas rilis. Prioritas hanya dapat disetel saat meluncurkan rilis baru, dan tidak dapat diubah setelahnya.
Untuk menyetel prioritas menggunakan Google Play Developer API, Anda dapat membuat alur kerja Edit, mengupload APK atau paket baru, menetapkannya ke track dan melakukan pengeditan seperti yang dijelaskan pada dokumentasi Play Developer API.
Prioritas update dalam aplikasi harus ditentukan dalam Edits.tracks resource
yang diteruskan dalam metode Edits.tracks: update
. Sebagai contoh, untuk merilis APK dengan kode versi 88, dengan
inAppUpdatePriority
5:
{ "releases": [{ "versionCodes": ["88"], "inAppUpdatePriority": 5, "status": "completed" }] }
Dalam kode aplikasi, Anda dapat memeriksa tingkat prioritas untuk update tertentu dengan menggunakan updatePriority()
,
sesuai petunjuk:
Kotlin
// Creates instance of the manager. 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() >= HIGH_PRIORITY_UPDATE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { // Request an immediate update. }
Java
// Creates instance of the manager. 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() >= HIGH_PRIORITY_UPDATE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { // Request an immediate update. } });
Memulai update
Setelah memeriksa apakah Anda dapat mengupdate aplikasi, Anda dapat meminta update dengan menggunakan AppUpdateManager.startUpdateFlowForResult()
, sesuai petunjuk. Namun, Anda harus memperhatikan seberapa sering Anda meminta update agar tidak mengganggu dan membuat pengguna jenuh. Dengan demikian, Anda harus membatasi permintaan update dalam aplikasi hanya untuk perubahan yang dibutuhkan untuk fungsi aplikasi.
Kotlin
appUpdateManager.startUpdateFlowForResult( // Pass the intent that is returned by 'getAppUpdateInfo()'. appUpdateInfo, // Or 'AppUpdateType.FLEXIBLE' for flexible updates. AppUpdateType.IMMEDIATE, // The current activity making the update request. this, // Include a request code to later monitor this update request. MY_REQUEST_CODE)
Java
appUpdateManager.startUpdateFlowForResult( // Pass the intent that is returned by 'getAppUpdateInfo()'. appUpdateInfo, // Or 'AppUpdateType.FLEXIBLE' for flexible updates. AppUpdateType.IMMEDIATE, // The current activity making the update request. this, // Include a request code to later monitor this update request. MY_REQUEST_CODE);
Setiap instance AppUpdateInfo
hanya dapat digunakan untuk memulai update sekali saja.
Untuk mencoba update kembali jika gagal, Anda harus meminta AppUpdateInfo
baru
dan memeriksa lagi apakah update tersedia dan diizinkan.
Jenis update yang Anda minta menentukan langkah selanjutnya yang perlu Anda lakukan. Untuk mempelajari lebih lanjut, baca bagian tentang cara Menangani update langsung atau Menangani update fleksibel.
Mendapatkan callback untuk status update
Setelah memulai update, Anda dapat menggunakan
callback onActivityResult()
untuk menangani kegagalan atau pembatalan update, seperti yang dijelaskan dalam tampilan.
Kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == MY_REQUEST_CODE) { if (resultCode != RESULT_OK) { log("Update flow failed! Result code: $resultCode") // If the update is cancelled or fails, // you can request to start the update again. } } }
Java
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MY_REQUEST_CODE) { if (resultCode != RESULT_OK) { log("Update flow failed! Result code: " + resultCode); // If the update is cancelled or fails, // you can request to start the update again. } } }
Yang berikut menjelaskan nilai berbeda yang mungkin Anda terima dari
callback onActivityResult()
:
RESULT_OK
: Pengguna telah menyetujui update. Untuk update langsung, Anda mungkin tidak menerima callback ini karena seharusnya update telah diselesaikan oleh Google Play saat kontrol dikembalikan ke aplikasi Anda.RESULT_CANCELED
: Pengguna telah menolak atau membatalkan update.ActivityResult.RESULT_IN_APP_UPDATE_FAILED
: Beberapa error lain mencegah pengguna memberikan izin atau mencegah update dilanjutkan.
Menangani update fleksibel
Saat Anda memulai update fleksibel, dialog terlebih dahulu akan muncul kepada pengguna untuk meminta izin. Jika pengguna mengizinkan, download akan dimulai di latar belakang, dan pengguna dapat melanjutkan berinteraksi dengan aplikasi. Bagian ini menjelaskan cara memantau dan menyelesaikan update dalam aplikasi fleksibel.
Memantau status update aplikasi
Setelah pengguna menyetujui update fleksibel, Google Play mulai mendownload update di latar belakang. Setelah download dimulai, aplikasi Anda perlu memantau status update untuk mengetahui kapan update dapat diinstal dan menampilkan progres di UI aplikasi.
Anda dapat memantau status update yang sedang berlangsung dengan mendaftarkan pemroses untuk menginstal update status. Anda juga dapat memberikan status progres di UI aplikasi, untuk memberi tahu pengguna sejauh mana download berlangsung.
Kotlin
// Create a listener to track request state updates. val listener = { 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);
Menginstal update fleksibel
Jika Anda memantau status update fleksibel dan Anda mendeteksi status InstallStatus.DOWNLOADED
, Anda perlu memulai ulang aplikasi untuk menginstal update.
Tidak seperti update langsung, Google Play tidak memicu mulai ulang aplikasi untuk Anda. Itu karena, selama proses update fleksibel, pengguna berharap untuk terus menggunakan aplikasi hingga memutuskan apakah pengguna ingin menginstal update.
Jadi sebaiknya Anda memberi notifikasi (atau beberapa indikasi UI lain) yang memberi tahu pengguna bahwa penginstalan telah siap dan meminta konfirmasi pengguna untuk memulai ulang aplikasi.
Misalnya, Anda dapat menerapkan konfirmasi permintaan snackbar dengan Desain Materialdari pengguna untuk memulai ulang aplikasi, seperti yang ditunjukkan pada gambar 1.
Contoh kode berikut menampilkan notifikasi snackbar kepada pengguna setelah update fleksibel didownload.
Kotlin
override fun onStateUpdate(state: InstallState) { 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
@Override public void onStateUpdate(InstallState 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(); }
Saat Anda memanggil
appUpdateManager.completeUpdate()
di latar depan, platform menampilkan UI layar penuh yang memulai ulang aplikasi
di latar belakang. Setelah platform menginstal update, aplikasi memulai ulang dalam aktivitas utamanya.
Jika Anda lebih memilih menelepon appUpdateManager.completeUpdate()
saat aplikasi berada di latar belakang, update akan diinstal secara senyap tanpa mengaburkan UI perangkat.
Saat pengguna membawa aplikasi ke latar depan, sebaiknya Anda memeriksa apakah aplikasi tidak memiliki update yang menunggu untuk diinstal. Jika aplikasi Anda memiliki update dalam status DOWNLOADED
, tampilkan notifikasi untuk meminta pengguna menginstal update, seperti yang ditunjukkan pada tampilan. Jika tidak, data update akan terus mengisi penyimpanan perangkat pengguna.
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(); } }); }
Menangani update langsung
Jika Anda melakukan update langsung, dan pengguna menyetujui penginstalan update, Google Play menampilkan progres update di UI aplikasi teratas selama durasi update. Selama proses update, jika pengguna menutup atau menghentikan aplikasi, update akan melanjutkan download dan menginstal di latar belakang tanpa menunggu konfirmasi tambahan dari pengguna.
Namun, jika aplikasi kembali ke latar depan, Anda harus mengonfirmasi
bahwa update tidak dihentikan di status
UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
. Jika update terhenti dalam status ini, lanjutkan update, seperti yang ditunjukkan pada tampilan:
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, IMMEDIATE, this, MY_REQUEST_CODE ); } } }
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, IMMEDIATE, this, MY_REQUEST_CODE); } }); }
Aplikasi Anda harus mampu menangani kasus ketika pengguna menolak update atau membatalkan download. Saat pengguna melakukan salah satu tindakan ini, UI Google Play akan ditutup, dan aplikasi Anda akan menentukan cara terbaik untuk melanjutkannya.
Jika memungkinkan, pertimbangkan untuk mengizinkan pengguna melanjutkan tanpa update, kemudian minta mereka untuk memulai alur update kembali. Jika aplikasi Anda tidak dapat berfungsi tanpa update, pertimbangkan untuk menampilkan pesan informatif sebelum memulai ulang alur update atau minta pengguna untuk menutup aplikasi (atau perintahkan agar aplikasi menutup sendiri). Dengan cara ini, pengguna memahami bahwa mereka dapat meluncurkan kembali aplikasi Anda saat mereka siap mendownload update.
Lakukan pengujian dengan fitur berbagi aplikasi secara internal
Dengan berbagi aplikasi secara internal, Anda dapat dengan cepat berbagi app bundle atau APK dengan tim internal dan penguji dengan mengupload app bundle yang ingin Anda uji ke Konsol Play.
Anda juga dapat menggunakan berbagi aplikasi secara internal untuk menguji update dalam aplikasi, sebagai berikut:
- Pada perangkat pengujian, pastikan Anda telah menginstal versi aplikasi yang memenuhi persyaratan berikut:
- Aplikasi dipasang dengan menggunakan URL berbagi aplikasi secara internal
- Mendukung update dalam aplikasi
- Menggunakan kode versi yang lebih rendah dari versi aplikasi yang telah diupdate
- Ikuti petunjuk Konsol Play tentang cara membagikan aplikasi Anda secara internal. Pastikan Anda mengupload versi aplikasi yang menggunakan kode versi yang lebih tinggi dari kode yang telah Anda instal pada perangkat uji.
- Pada perangkat uji, cukup klik link berbagi aplikasi secara internal untuk versi aplikasi yang telah diupdate. Jangan instal aplikasi dari halaman Google Play Store yang Anda lihat setelah mengeklik link.
- Buka aplikasi dari panel daftar aplikasi atau layar utama perangkat. Saat ini, update seharusnya sudah tersedia untuk aplikasi Anda, dan Anda dapat menguji implementasi update dalam aplikasi.
Memecahkan masalah
Bagian ini menjelaskan beberapa kemungkinan solusi untuk situasi saat update dalam aplikasi tidak berfungsi seperti yang diharapkan selama pengujian.
- Update dalam aplikasi hanya tersedia untuk akun pengguna yang memiliki aplikasi. Jadi, pastikan akun yang Anda gunakan telah mendownload aplikasi dari Google Play setidaknya sekali sebelum menggunakan akun untuk menguji update dalam aplikasi.
- Pastikan bahwa aplikasi, tempat Anda menguji update dalam aplikasi, memiliki ID aplikasi dan ditandatangani dengan kunci penandatanganan yang sama dengan yang tersedia dari Google Play.
- Karena Google Play hanya dapat mengupdate aplikasi ke kode versi yang lebih tinggi, pastikan aplikasi yang Anda uji kode versinya lebih rendah daripada kode versi update-nya.
- Pastikan akun memenuhi syarat dan cache Google Play sudah yang paling baru. Untuk melakukannya, saat login ke akun Google Play Store
di perangkat pengujian, lanjutkan seperti berikut:
- Pastikan Anda menutup Aplikasi Google Play Store sepenuhnya.
- Buka aplikasi Google Play Store dan buka tab Aplikasi & Game Saya .
- Jika aplikasi yang sedang Anda uji tidak muncul dengan update yang tersedia, periksa apakah Anda telah menyiapkan track pengujian dengan benar.