คู่มือนี้อธิบายวิธีรองรับการอัปเดตในแอปในแอปโดยใช้ Kotlin หรือ Java มีคำแนะนำแยกต่างหากสำหรับกรณีที่การติดตั้งใช้งานของคุณใช้โค้ดแบบเนทีฟ (C/C++) และกรณีที่การติดตั้งใช้งานของคุณใช้ Unity หรือ Unreal Engine
ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์
ไลบรารีการอัปเดตในแอปของ 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. } });
ตรวจสอบลำดับความสำคัญของการอัปเดต
Google Play Developer API ช่วยให้คุณกำหนดลำดับความสำคัญของการอัปเดตแต่ละรายการได้ ซึ่งจะช่วยให้แอปตัดสินใจได้ว่าจะแนะนำให้อัปเดตแก่ผู้ใช้มากน้อยเพียงใด ตัวอย่างเช่น ลองใช้กลยุทธ์ต่อไปนี้ในการกำหนดลำดับความสำคัญของการอัปเดต
- การปรับปรุง 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()
การเรียกกลับ
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 จะปิด แอปของคุณ
ควรกำหนดวิธีที่ดีที่สุดในการดำเนินการต่อ
หากเป็นไปได้ ให้ผู้ใช้ดำเนินการต่อโดยไม่ต้องอัปเดตและแจ้งให้ผู้ใช้อัปเดตอีกครั้งในภายหลัง หากแอปทำงานไม่ได้หากไม่มีการอัปเดต ให้พิจารณาแสดง ข้อความที่ให้ข้อมูลก่อนที่จะรีสตาร์ทโฟลว์การอัปเดตหรือแจ้งให้ผู้ใช้ ปิดแอป เพื่อให้ผู้ใช้ทราบว่าสามารถเปิดแอปอีกครั้งได้ เมื่อพร้อมที่จะติดตั้งการอัปเดตที่จำเป็น
ขั้นตอนถัดไป
ทดสอบการอัปเดตในแอปของแอปเพื่อยืนยันว่าการผสานรวมทำงานได้อย่างถูกต้อง