รองรับการอัปเดตในแอป (Kotlin หรือ Java)

คู่มือนี้จะอธิบายวิธีการสนับสนุนในแอป การอัปเดตในแอปโดยใช้ Kotlin หรือ Java เรามีคำแนะนำแยกต่างหากสำหรับกรณีที่การติดตั้งของคุณใช้โค้ดเนทีฟ (C/C++) และกรณีที่ จะใช้ Unity

ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์

ไลบรารีการอัปเดตในแอป Play เป็นส่วนหนึ่งของไลบรารีหลักของ Google Play โปรดระบุการอ้างอิง Gradle ต่อไปนี้เพื่อผสานรวม Play In-App อัปเดตคลัง

ดึงดูด

// 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 วัน ก่อนที่จะแจ้งให้ผู้ใช้ทราบถึงการอัปเดตที่ยืดหยุ่น และไม่กี่วันหลังจากนั้น ก่อนที่จะต้องอัปเดตทันที

ใช้ 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 ในส่วน 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() ติดต่อกลับ:

  • 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 จะปิดลง แอปของคุณควรกําหนดวิธีที่ดีที่สุดในการดําเนินการต่อ

หากเป็นไปได้ ให้ผู้ใช้ดำเนินการต่อโดยไม่อัปเดตและแจ้งให้ผู้ใช้อีกครั้ง ในภายหลัง หากแอปไม่สามารถทำงานได้หากไม่มีการอัปเดต ให้พิจารณาแสดง ก่อนรีสตาร์ทขั้นตอนการอัปเดตหรือแจ้งให้ผู้ใช้ ปิดแอป ซึ่งจะช่วยให้ผู้ใช้เข้าใจว่าสามารถเปิดแอปของคุณอีกครั้งได้ เมื่อผู้ใช้พร้อมที่จะติดตั้งการอัปเดตที่จำเป็น

ขั้นตอนถัดไป

ทดสอบการอัปเดตในแอปของแอปเพื่อยืนยัน เพื่อให้มั่นใจว่าการผสานรวมทำงานได้อย่างถูกต้อง