คู่มือนี้จะอธิบายวิธีรองรับการอัปเดตในแอปในแอปโดยใช้ Kotlin หรือ Java มีคู่มือแยกต่างหากสำหรับกรณีที่การติดตั้งใช้งานใช้โค้ดเนทีฟ (C/C++) และกรณีที่การติดตั้งใช้งานใช้ Unity
ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์
ไลบรารีอัปเดตในแอปของ Play เป็นส่วนหนึ่งของไลบรารี Google Play Core โปรดใส่ Dependency ของ Gradle ต่อไปนี้เพื่อผสานรวมไลบรารีการอัปเดตในแอปของ Play
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") ... }
ตรวจสอบความพร้อมในการอัปเดต
ก่อนขออัปเดต ให้ตรวจสอบว่าแอปของคุณมีอัปเดตให้ใช้งานหรือไม่ ใช้ AppUpdateManager
เพื่อตรวจสอบการอัปเดต
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. } });
อินสแตนซ์ AppUpdateInfo
ที่แสดงผลจะมีสถานะความพร้อมอัปเดต นอกจากนี้ อินสแตนซ์ยังมีข้อมูลต่อไปนี้โดยขึ้นอยู่กับสถานะของการอัปเดต
- หากมีอัปเดตพร้อมใช้งานและอนุญาตให้อัปเดตได้ อินสแตนซ์จะมีเจตนาเริ่มอัปเดตด้วย
- หากการอัปเดตในแอปกำลังดำเนินการอยู่ อินสแตนซ์จะรายงานสถานะของการอัปเดตที่ดำเนินการอยู่ด้วย
ตรวจสอบความล้าสมัยของการอัปเดต
นอกจากการตรวจสอบว่ามีการอัปเดตหรือไม่แล้ว คุณอาจต้องตรวจสอบด้วยว่าเวลาผ่านไปนานเท่าใดนับตั้งแต่ที่ผู้ใช้ได้รับการแจ้งเตือนการอัปเดตครั้งล่าสุดผ่าน Play Store ซึ่งจะช่วยให้คุณตัดสินใจได้ว่าจะเริ่มต้นการอัปเดตแบบยืดหยุ่นหรือการอัปเดตทันที เช่น คุณอาจต้องรอ 2-3 วันก่อนแจ้งผู้ใช้เกี่ยวกับการอัปเดตที่ยืดหยุ่น และ 2-3 วันหลังจากนั้นก่อนที่จะต้องอัปเดตทันที
ใช้
clientVersionStalenessDays()
เพื่อตรวจสอบจำนวนวันนับตั้งแต่ที่การอัปเดตพร้อมให้บริการใน Play Store
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. } });
ตรวจสอบลำดับความสำคัญของการอัปเดต
API สำหรับนักพัฒนาซอฟต์แวร์ Google Play ช่วยให้คุณสามารถกำหนดลำดับความสำคัญของการอัปเดตแต่ละครั้งได้ วิธีนี้ช่วยให้แอปของคุณตัดสินใจได้ว่าจะแนะนำการอัปเดตให้กับผู้ใช้มากแค่ไหน ตัวอย่างเช่น ลองพิจารณากลยุทธ์ต่อไปนี้ในการตั้งค่าลำดับความสำคัญของการอัปเดต
- การปรับปรุง UI เล็กน้อย: การอัปเดตสำคัญน้อย ไม่ขอการอัปเดตแบบยืดหยุ่นหรือการอัปเดตทันที อัปเดตเฉพาะเมื่อผู้ใช้ไม่ได้โต้ตอบกับแอป
- การปรับปรุงประสิทธิภาพ: การอัปเดตสำคัญปานกลาง ขอการอัปเดตแบบยืดหยุ่น
- การอัปเดตความปลอดภัยที่สำคัญ: การอัปเดตสำคัญสูง ขอการอัปเดตทันที
Google Play ใช้ค่าจำนวนเต็มระหว่าง 0 ถึง 5 เพื่อกำหนดลำดับความสำคัญ โดย 0 จะเป็นค่าเริ่มต้นและ 5 จะเป็นลำดับความสำคัญสูงสุด หากต้องการตั้งค่าลำดับความสำคัญของการอัปเดต ให้ใช้ช่อง inAppUpdatePriority
ในส่วน Edits.tracks.releases
ใน Google Play Developer API ระบบจะถือว่าเวอร์ชันที่เพิ่มเข้ามาใหม่ทั้งหมดในรุ่นมีลำดับความสำคัญเท่ากับรุ่นนั้น คุณกำหนดลำดับความสำคัญได้เมื่อเปิดตัวรุ่นใหม่เท่านั้น และจะเปลี่ยนแปลงในภายหลังไม่ได้
กำหนดลำดับความสำคัญโดยใช้ Google Play Developer API ตามที่อธิบายไว้ในเอกสารประกอบ Play Developer API
คุณควรระบุลำดับความสำคัญของการอัปเดตในแอปในแหล่งข้อมูล Edit.tracks
ที่ส่งในเมธอด Edit.tracks: update
ตัวอย่างต่อไปนี้แสดงการเผยแพร่แอปที่มีรหัสเวอร์ชัน 88 และ inAppUpdatePriority
5
{ "releases": [{ "versionCodes": ["88"], "inAppUpdatePriority": 5, "status": "completed" }] }
ในโค้ดของแอป คุณสามารถตรวจสอบระดับความสำคัญของการอัปเดตหนึ่งๆ ได้โดยใช้ updatePriority()
ลำดับความสำคัญที่แสดงผลจะพิจารณา inAppUpdatePriority
สำหรับรหัสเวอร์ชันแอปทั้งหมดระหว่างเวอร์ชันที่ติดตั้งและเวอร์ชันล่าสุดที่พร้อมใช้งาน โดยไม่คำนึงถึงแทร็กที่เผยแพร่ ตัวอย่างเช่น โปรดพิจารณาสถานการณ์สมมติต่อไปนี้
- คุณเผยแพร่เวอร์ชัน 1 ไปยังแทร็กเวอร์ชันที่ใช้งานจริงโดยไม่มีลําดับความสําคัญ
- คุณเผยแพร่เวอร์ชัน 2 ในแทร็กทดสอบภายในที่มีลําดับความสําคัญ 5
- คุณเผยแพร่เวอร์ชัน 3 ไปยังแทร็กเวอร์ชันที่ใช้งานจริงโดยไม่มีลําดับความสําคัญ
เมื่อผู้ใช้เวอร์ชันที่ใช้งานจริงอัปเดตจากเวอร์ชัน 1 เป็นเวอร์ชัน 3 ผู้ใช้จะได้รับลําดับความสําคัญ 5 แม้ว่าเวอร์ชัน 2 จะเผยแพร่ในแทร็กอื่นก็ตาม
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. } });
เริ่มอัปเดต
หลังจากยืนยันว่ามีอัปเดตพร้อมใช้งานแล้ว คุณจะขออัปเดตได้โดยใช้ 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());
อินสแตนซ์ AppUpdateInfo
แต่ละรายการสามารถใช้เพื่อเริ่มการอัปเดตได้เพียงครั้งเดียว หากต้องการลองอัปเดตอีกครั้งในกรณีที่อัปเดตไม่สำเร็จ ให้ขอ AppUpdateInfo
ใหม่และตรวจสอบอีกครั้งว่าอัปเดตพร้อมใช้งานและได้รับอนุญาต
คุณสามารถลงทะเบียนตัวเปิดใช้งานผลการค้นหากิจกรรมได้โดยใช้สัญญาในตัว
ActivityResultContracts.StartIntentSenderForResult
โปรดดูส่วนการรับการติดต่อกลับเพื่อขอสถานะการอัปเดต
ขั้นตอนถัดไปจะขึ้นอยู่กับว่าคุณกำลังขอการอัปเดตแบบยืดหยุ่นหรือการอัปเดตทันที
กำหนดค่าการอัปเดตด้วย AppUpdateOptions
AppUpdateOptions
มีช่อง AllowAssetPackDeletion
ที่ระบุว่าอนุญาตให้อัปเดตล้าง Asset Pack หรือไม่ในกรณีที่มีพื้นที่เก็บข้อมูลในอุปกรณ์จำกัด ระบบจะตั้งค่าช่องนี้เป็น false
โดยค่าเริ่มต้น แต่คุณใช้วิธี setAllowAssetPackDeletion()
เพื่อตั้งค่าเป็น true
แทนได้ ดังนี้
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());
รับการติดต่อกลับเพื่ออัปเดตสถานะ
หลังจากเริ่มการอัปเดตแล้ว แบ็กคอลโปรแกรมเปิดใช้งานผลลัพธ์กิจกรรมที่ลงทะเบียนไว้จะได้รับผลลัพธ์กล่องโต้ตอบการยืนยัน ดังนี้
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 ดังนี้
RESULT_OK
: ผู้ใช้ยอมรับการอัปเดตแล้ว สำหรับการอัปเดตทันที คุณอาจไม่ได้รับการเรียกกลับนี้เนื่องจากระบบควรอัปเดตเสร็จแล้วเมื่อมีการคืนการควบคุมกลับไปยังแอปRESULT_CANCELED
: ผู้ใช้ปฏิเสธหรือยกเลิกการอัปเดตActivityResult.RESULT_IN_APP_UPDATE_FAILED
: ข้อผิดพลาดอื่นๆ บางอย่างทําให้ผู้ใช้ไม่ให้ความยินยอมหรือทําให้การอัปเดตดำเนินการต่อไม่ได้
จัดการการอัปเดตแบบยืดหยุ่น
เมื่อคุณเริ่มการอัปเดตที่ยืดหยุ่น กล่องโต้ตอบจะปรากฏขึ้นแก่ผู้ใช้เพื่อขอความยินยอมก่อน หากผู้ใช้ยินยอม ระบบจะเริ่มการดาวน์โหลดในเบื้องหลังและผู้ใช้จะโต้ตอบกับแอปต่อไปได้ ส่วนนี้จะอธิบายวิธีตรวจสอบและอัปเดตในแอปแบบยืดหยุ่นให้เสร็จสมบูรณ์
ตรวจสอบสถานะการอัปเดตที่ยืดหยุ่น
หลังจากการดาวน์โหลดสำหรับการอัปเดตแบบยืดหยุ่นเริ่มต้นขึ้น แอปของคุณต้องตรวจสอบสถานะการอัปเดตเพื่อดูว่าติดตั้งการอัปเดตได้เมื่อใด และเพื่อแสดงความคืบหน้าใน UI ของแอป
คุณตรวจสอบสถานะของการอัปเดตที่กำลังดำเนินการอยู่ได้ด้วยการลงทะเบียน Listener สำหรับการอัปเดตสถานะการติดตั้ง นอกจากนี้คุณยังระบุแถบความคืบหน้าใน UI ของแอปเพื่อแจ้งให้ผู้ใช้ทราบเกี่ยวกับความคืบหน้าในการดาวน์โหลดได้ด้วย
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);
ติดตั้งการอัปเดตแบบยืดหยุ่น
เมื่อตรวจพบสถานะ InstallStatus.DOWNLOADED
คุณต้องรีสตาร์ทแอปเพื่อติดตั้งการอัปเดต
Google Play จะไม่ทริกเกอร์ให้แอปรีสตาร์ทโดยอัตโนมัติเพื่อให้มีการอัปเดตที่ยืดหยุ่น ซึ่งต่างจากการอัปเดตโดยทันที เนื่องจากในระหว่างการอัปเดตแบบยืดหยุ่น ผู้ใช้จะคาดหวังว่าจะโต้ตอบกับแอปต่อไปได้จนกว่าจะตัดสินใจว่าต้องการติดตั้งการอัปเดต
ขอแนะนำให้คุณแสดงการแจ้งเตือน (หรือสัญญาณบอกสถานะ UI อื่นๆ) เพื่อแจ้งให้ผู้ใช้ทราบว่าอัปเดตพร้อมให้ติดตั้งแล้วและขอการยืนยันก่อนรีสตาร์ทแอป
ตัวอย่างต่อไปนี้แสดงการใช้งานแถบข้อมูลใน Material Design ที่ขอการยืนยันจากผู้ใช้ให้รีสตาร์ทแอป
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(); }
เมื่อคุณเรียกใช้ appUpdateManager.completeUpdate()
ในเบื้องหน้า แพลตฟอร์มจะแสดง UI แบบเต็มหน้าจอที่รีสตาร์ทแอปในเบื้องหลัง หลังจากแพลตฟอร์มติดตั้งการอัปเดตแล้ว แอปจะรีสตาร์ทไปยังกิจกรรมหลัก
หากคุณเรียกใช้ completeUpdate()
เมื่อแอปทำงานอยู่เบื้องหลัง ระบบจะติดตั้งการอัปเดตโดยอัตโนมัติโดยไม่บดบัง UI ของอุปกรณ์
เมื่อใดก็ตามที่ผู้ใช้นำแอปของคุณไปไว้ที่เบื้องหน้า ให้ตรวจสอบว่าแอปของคุณมีการอัปเดตที่รอให้ติดตั้งหรือไม่ หากแอปมีการอัปเดตในสถานะ DOWNLOADED
ให้แจ้งให้ผู้ใช้ติดตั้งการอัปเดต ไม่เช่นนั้น ข้อมูลอัปเดตจะยังคงใช้พื้นที่เก็บข้อมูลในอุปกรณ์ของผู้ใช้ต่อไป
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(); } }); }
จัดการการอัปเดตทันที
เมื่อคุณเริ่มการอัปเดตทันทีและผู้ใช้ยินยอมที่จะเริ่มการอัปเดต Google Play จะแสดงความคืบหน้าในการอัปเดตที่ด้านบนของ UI ของแอปตลอดระยะเวลาการอัปเดต หากผู้ใช้ปิดหรือสิ้นสุดการทำงานของแอประหว่างการอัปเดต ระบบจะดาวน์โหลดและติดตั้งการอัปเดตต่อไปในเบื้องหลังโดยที่ผู้ใช้ไม่ต้องยืนยันเพิ่มเติม
อย่างไรก็ตาม เมื่อแอปกลับมาอยู่เบื้องหน้า คุณควรตรวจสอบว่าอัปเดตไม่ได้หยุดชะงักในสถานะ UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
หากการอัปเดตหยุดชะงักในสถานะนี้ ให้ดำเนินการอัปเดตต่อโดยทำดังนี้
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()); } }); }
ขั้นตอนการอัปเดตจะแสดงผลลัพธ์ตามที่อธิบายไว้ในเอกสารอ้างอิงสำหรับ startUpdateFlowForResult() โดยเฉพาะอย่างยิ่ง แอปของคุณควรสามารถจัดการกรณีที่ผู้ใช้ปฏิเสธการอัปเดตหรือยกเลิกการดาวน์โหลดได้ เมื่อผู้ใช้ทำอย่างใดอย่างหนึ่งข้างต้น UI ของ Google Play จะปิดลง แอปควรกำหนดวิธีที่ดีที่สุดในการดำเนินการต่อ
หากเป็นไปได้ ให้ผู้ใช้ดำเนินการต่อโดยไม่ทำการอัปเดตและแจ้งอีกครั้งในภายหลัง หากแอปของคุณไม่ทำงานหากไม่มีการอัปเดต ให้พิจารณาแสดงข้อความที่ให้ข้อมูลก่อนเริ่มขั้นตอนการอัปเดตอีกครั้งหรือแจ้งให้ผู้ใช้ปิดแอป วิธีนี้จะช่วยให้ผู้ใช้ทราบว่าสามารถเปิดแอปอีกครั้งได้เมื่อพร้อมที่จะติดตั้งการอัปเดตที่จำเป็น
ขั้นตอนถัดไป
ทดสอบการอัปเดตในแอปเพื่อยืนยันว่าการผสานรวมทำงานได้อย่างถูกต้อง