इन-ऐप्लिकेशन अपडेट के साथ काम करता है (Kotlin या Java)

इस गाइड में बताया गया है कि अपने ऐप्लिकेशन में अपडेट लागू करने की सुविधा कैसे जोड़ें. इसके लिए, Kotlin या Java का इस्तेमाल किया जा सकता है. अगर आपके ऐप्लिकेशन में नेटिव कोड (C/C++) का इस्तेमाल किया गया है, तो इसके लिए अलग गाइड उपलब्ध है. इसी तरह, अगर आपके ऐप्लिकेशन में Unity या Unreal Engine का इस्तेमाल किया गया है, तो इसके लिए भी अलग गाइड उपलब्ध है.

अपना डेवलपमेंट एनवायरमेंट सेट अप करना

Play In-App Update Library, Google Play Core libraries का हिस्सा है. Play In-App Update Library को इंटिग्रेट करने के लिए, यह Gradle डिपेंडेंसी शामिल करें.

शानदार

// 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 के ज़रिए उपयोगकर्ता को अपडेट के बारे में सूचना दिए हुए कितना समय हो गया है. इससे आपको यह तय करने में मदद मिलती है कि आपको फ़्लेक्सिबल अपडेट का अनुरोध करना चाहिए या तुरंत अपडेट का. उदाहरण के लिए, हो सकता है कि फ़्लेक्सिबल अपडेट के बारे में उपयोगकर्ता को सूचना देने से पहले, कुछ दिन इंतज़ार किया जाए. इसके बाद, तुरंत अपडेट का अनुरोध करने से पहले भी कुछ दिन इंतज़ार किया जाए.

यह देखने के लिए कि Play Store पर अपडेट उपलब्ध हुए कितने दिन हो गए हैं, clientVersionStalenessDays() का इस्तेमाल करें:

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 डेवलपर एपीआई की मदद से, हर अपडेट की प्राथमिकता सेट की जा सकती है. इससे आपका ऐप्लिकेशन यह तय कर पाता है कि उपयोगकर्ता को अपडेट करने का सुझाव कितनी गंभीरता से देना है. उदाहरण के लिए, अपडेट की प्राथमिकता सेट करने के लिए, यह रणनीति अपनाई जा सकती है:

  • यूज़र इंटरफ़ेस (यूआई) में छोटे-मोटे सुधार: कम प्राथमिकता वाला अपडेट. इसके लिए, न तो फ़्लेक्सिबल अपडेट का अनुरोध करें और न ही तुरंत अपडेट का. अपडेट सिर्फ़ तब करें, जब उपयोगकर्ता आपके ऐप्लिकेशन का इस्तेमाल न कर रहा हो.
  • परफ़ॉर्मेंस में सुधार: मीडियम प्राथमिकता वाला अपडेट. इसके लिए, फ़्लेक्सिबल अपडेट का अनुरोध करें.
  • सुरक्षा से जुड़ा ज़रूरी अपडेट: ज़्यादा प्राथमिकता वाला अपडेट. इसके लिए, तुरंत अपडेट का अनुरोध करें.

प्राथमिकता तय करने के लिए, Google Play 0 से 5 तक की पूर्णांक वैल्यू का इस्तेमाल करता है. इसमें 0 डिफ़ॉल्ट वैल्यू है और 5 सबसे ज़्यादा प्राथमिकता वाली वैल्यू है. किसी अपडेट की प्राथमिकता सेट करने के लिए, Google Play Developer API में Edits.tracks.releases के तहत, inAppUpdatePriority फ़ील्ड का इस्तेमाल करें. रिलीज़ में जोड़े गए सभी नए वर्शन को, रिलीज़ के बराबर प्राथमिकता दी जाती है. नई रिलीज़ रोल आउट करते समय ही प्राथमिकता सेट की जा सकती है. बाद में इसे बदला नहीं जा सकता.

Google Play Developer API का इस्तेमाल करके प्राथमिकता सेट करने के लिए, Play Developer API के दस्तावेज़ में बताया गया तरीका अपनाएं. इन-ऐप्लिकेशन अपडेट की प्राथमिकता, Edit.tracks: update तरीके में पास किए गए Edit.tracks संसाधन में बताई जानी चाहिए. यहां दिए गए उदाहरण में, वर्शन कोड 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 फ़ील्ड होता है. इससे यह तय होता है कि डिवाइस में स्टोरेज की जगह कम होने पर, अपडेट के दौरान ऐसेट पैक मिटाने की अनुमति है या नहीं. डिफ़ॉल्ट रूप से, इस फ़ील्ड की वैल्यू 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: किसी अन्य गड़बड़ी की वजह से, उपयोगकर्ता सहमति नहीं दे पाया या अपडेट आगे नहीं बढ़ पाया.

फ़्लेक्सिबल अपडेट को मैनेज करना

फ़्लेक्सिबल अपडेट शुरू करने पर, उपयोगकर्ता को सहमति का अनुरोध करने के लिए, सबसे पहले एक डायलॉग दिखता है. अगर उपयोगकर्ता सहमति देता है, तो बैकग्राउंड में डाउनलोड शुरू हो जाता है. साथ ही, उपयोगकर्ता आपके ऐप्लिकेशन का इस्तेमाल जारी रख सकता है. इस सेक्शन में, फ़्लेक्सिबल इन-ऐप्लिकेशन अपडेट को मॉनिटर करने और पूरा करने का तरीका बताया गया है.

फ़्लेक्सिबल अपडेट का स्टेटस मॉनिटर करना

फ़्लेक्सिबल अपडेट के लिए डाउनलोड शुरू होने के बाद, आपके ऐप्लिकेशन को अपडेट का स्टेटस मॉनिटर करना होगा. इससे यह पता चलेगा कि अपडेट कब इंस्टॉल किया जा सकता है. साथ ही, आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में प्रोग्रेस दिखेगी.

इंस्टॉल के स्टेटस के अपडेट के लिए, लिसनर रजिस्टर करके, जारी अपडेट का स्टेटस मॉनिटर किया जा सकता है. उपयोगकर्ताओं को डाउनलोड की प्रोग्रेस के बारे में बताने के लिए, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में प्रोग्रेस बार भी दिया जा सकता है.

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, फ़्लेक्सिबल अपडेट के लिए ऐप्लिकेशन को अपने-आप रीस्टार्ट नहीं करता. ऐसा इसलिए होता है, क्योंकि फ़्लेक्सिबल अपडेट के दौरान, उपयोगकर्ता को यह उम्मीद होती है कि वह अपडेट इंस्टॉल करने का फ़ैसला लेने तक, ऐप्लिकेशन का इस्तेमाल जारी रख पाएगा.

हमारा सुझाव है कि उपयोगकर्ता को यह बताने के लिए कोई सूचना (या यूज़र इंटरफ़ेस (यूआई) पर कोई अन्य संकेत) दें कि अपडेट इंस्टॉल करने के लिए तैयार है. साथ ही, ऐप्लिकेशन को रीस्टार्ट करने से पहले, पुष्टि का अनुरोध करें.

यहां दिए गए उदाहरण में, 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() को कॉल करने पर, प्लैटफ़ॉर्म एक फ़ुल-स्क्रीन यूज़र इंटरफ़ेस (यूआई) दिखाता है. इससे बैकग्राउंड में ऐप्लिकेशन रीस्टार्ट हो जाता है. प्लैटफ़ॉर्म के अपडेट इंस्टॉल करने के बाद, आपका ऐप्लिकेशन अपनी मुख्य गतिविधि में रीस्टार्ट हो जाता है.

इसके उलट, अगर आपका ऐप्लिकेशन बैकग्राउंड में है, तब completeUpdate() को कॉल किया जाता है, तो डिवाइस के यूज़र इंटरफ़ेस (यूआई) को धुंधला किए बिना, अपडेट चुपचाप इंस्टॉल हो जाता है.

जब भी उपयोगकर्ता आपके ऐप्लिकेशन को फ़ोरग्राउंड में लाता है, तो देखें कि आपके ऐप्लिकेशन के लिए कोई ऐसा अपडेट है या नहीं जो इंस्टॉल होने का इंतज़ार कर रहा है. अगर आपके ऐप्लिकेशन के लिए कोई अपडेट 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, अपडेट की पूरी अवधि के दौरान, आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) पर अपडेट की प्रोग्रेस दिखाता है. अगर उपयोगकर्ता अपडेट के दौरान आपके ऐप्लिकेशन को बंद कर देता है या खत्म कर देता है, तो अपडेट को बैकग्राउंड में डाउनलोड और इंस्टॉल किया जाना चाहिए. इसके लिए, उपयोगकर्ता की सहमति की ज़रूरत नहीं होती.

हालांकि, जब आपका ऐप्लिकेशन फ़ोरग्राउंड में वापस आता है, तो आपको यह पुष्टि करनी चाहिए कि अपडेट, 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() के रेफ़रंस दस्तावेज़ में बताए गए तरीके के मुताबिक, नतीजा दिखाता है. खास तौर पर, आपके ऐप्लिकेशन को उन स्थितियों को मैनेज करना चाहिए जहां कोई उपयोगकर्ता अपडेट अस्वीकार करता है या डाउनलोड रद्द करता है. जब उपयोगकर्ता इनमें से कोई भी कार्रवाई करता है, तो Google Play का यूज़र इंटरफ़ेस (यूआई) बंद हो जाता है. आपके ऐप्लिकेशन को आगे बढ़ने का सबसे सही तरीका तय करना चाहिए.

अगर मुमकिन हो, तो उपयोगकर्ता को अपडेट के बिना ऐप्लिकेशन का इस्तेमाल जारी रखने दें और बाद में उससे फिर से अपडेट का अनुरोध करें. अगर आपका ऐप्लिकेशन अपडेट के बिना काम नहीं कर सकता, तो अपडेट फ़्लो को रीस्टार्ट करने से पहले या उपयोगकर्ता को ऐप्लिकेशन बंद करने के लिए कहने से पहले, जानकारी देने वाला मैसेज दिखाएं. इससे उपयोगकर्ता को यह पता चलता है कि ज़रूरी अपडेट इंस्टॉल करने के बाद, वह आपके ऐप्लिकेशन को फिर से लॉन्च कर सकता है.

अगले चरण

अपने ऐप्लिकेशन के इन-ऐप्लिकेशन अपडेट की जांच करें, ताकि यह पुष्टि की जा सके कि आपका इंटिग्रेशन सही तरीके से काम कर रहा है