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