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

คู่มือนี้จะอธิบายวิธีรองรับการอัปเดตในแอปในแอปโดยใช้ 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 จะปิดลง แอปของคุณควรกําหนดวิธีที่ดีที่สุดในการดําเนินการต่อ

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

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

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