অ্যাপ-মধ্যস্থ আপডেট সমর্থন করে (কোটলিন বা জাভা)

কোটলিন বা জাভা ব্যবহার করে কীভাবে আপনার অ্যাপে অ্যাপ-মধ্যস্থ আপডেট সমর্থন করবেন তা এই নির্দেশিকাটি বর্ণনা করে। যে ক্ষেত্রে আপনার বাস্তবায়ন নেটিভ কোড (C/C++) ব্যবহার করে এবং যে ক্ষেত্রে আপনার বাস্তবায়ন ইউনিটি ব্যবহার করে তার জন্য আলাদা নির্দেশিকা রয়েছে।

আপনার উন্নয়ন পরিবেশ সেট আপ করুন

প্লে ইন-অ্যাপ আপডেট লাইব্রেরি হল Google Play কোর লাইব্রেরির একটি অংশ। প্লে ইন-অ্যাপ আপডেট লাইব্রেরি সংহত করতে অনুগ্রহ করে নিম্নলিখিত গ্রেডল নির্ভরতা অন্তর্ভুক্ত করুন।

গ্রোভি

// 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'
    ...
}

কোটলিন

// 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 ব্যবহার করুন:

কোটলিন

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.
    }
}

জাভা

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 উদাহরণে আপডেট উপলব্ধতার স্থিতি রয়েছে। আপডেটের অবস্থার উপর নির্ভর করে, উদাহরণে নিম্নলিখিতগুলিও রয়েছে:

  • যদি একটি আপডেট উপলব্ধ থাকে এবং আপডেটের অনুমতি দেওয়া হয়, উদাহরণটিতে আপডেটটি শুরু করার একটি অভিপ্রায়ও রয়েছে।
  • যদি একটি ইন-অ্যাপ আপডেট ইতিমধ্যেই প্রগতিতে থাকে, তাহলে ইনস্ট্যান্সটি ইন-প্রোগ্রেস আপডেটের অবস্থাও রিপোর্ট করে।

আপডেট অচলতা পরীক্ষা করুন

একটি আপডেট উপলব্ধ কিনা তা পরীক্ষা করার পাশাপাশি, আপনি প্লে স্টোরের মাধ্যমে ব্যবহারকারীকে সর্বশেষ আপডেটের বিষয়ে জানানোর পর থেকে কত সময় অতিবাহিত হয়েছে তাও পরীক্ষা করতে চাইতে পারেন। এটি আপনাকে সিদ্ধান্ত নিতে সাহায্য করতে পারে যে আপনি একটি নমনীয় আপডেট বা অবিলম্বে আপডেট শুরু করবেন কিনা। উদাহরণস্বরূপ, আপনি একটি নমনীয় আপডেটের সাথে ব্যবহারকারীকে অবহিত করার আগে কয়েক দিন অপেক্ষা করতে পারেন, এবং তার কয়েকদিন পরে একটি তাত্ক্ষণিক আপডেটের প্রয়োজন হওয়ার আগে।

প্লে স্টোরে আপডেটটি উপলব্ধ হওয়ার পর থেকে কত দিনের সংখ্যা পরীক্ষা করতে clientVersionStalenessDays() ব্যবহার করুন:

কোটলিন

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.
    }
}

জাভা

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 সর্বোচ্চ অগ্রাধিকার। একটি আপডেটের জন্য অগ্রাধিকার সেট করতে, Google Play Developer API-এ Edits.tracks.releases অধীনে inAppUpdatePriority ক্ষেত্রটি ব্যবহার করুন৷ রিলিজে সব নতুন-সংযোজিত সংস্করণকে রিলিজের মতোই অগ্রাধিকার হিসেবে বিবেচনা করা হয়। অগ্রাধিকার শুধুমাত্র একটি নতুন রিলিজ রোল আউট করার সময় সেট করা যেতে পারে এবং পরে পরিবর্তন করা যাবে না।

Play Developer API ডকুমেন্টেশনে বর্ণিত Google Play Developer API ব্যবহার করে অগ্রাধিকার সেট করুন। অ্যাপ-মধ্যস্থ আপডেট অগ্রাধিকার Edit.tracks Edit.tracks: update পদ্ধতিতে পাস করা Edit.tracks সম্পদে উল্লেখ করা উচিত। নিম্নলিখিত উদাহরণটি সংস্করণ কোড 88 এবং inAppUpdatePriority 5 সহ একটি অ্যাপ প্রকাশ করে:

{
  "releases": [{
      "versionCodes": ["88"],
      "inAppUpdatePriority": 5,
      "status": "completed"
  }]
}

আপনার অ্যাপের কোডে, আপনি updatePriority() ব্যবহার করে প্রদত্ত আপডেটের জন্য অগ্রাধিকার স্তর পরীক্ষা করতে পারেন। রিলিজ ট্র্যাক নির্বিশেষে, প্রত্যাবর্তিত অগ্রাধিকারটি ইনস্টল করা সংস্করণ এবং সর্বশেষ উপলব্ধ সংস্করণের মধ্যে সমস্ত অ্যাপ সংস্করণ কোডের জন্য inAppUpdatePriority বিবেচনা করে। উদাহরণস্বরূপ, নিম্নলিখিত দৃশ্যকল্প বিবেচনা করুন:

  • আপনি কোন অগ্রাধিকার ছাড়াই একটি প্রোডাকশন ট্র্যাকে সংস্করণ 1 প্রকাশ করেন।
  • আপনি অগ্রাধিকার 5 সহ একটি অভ্যন্তরীণ পরীক্ষা ট্র্যাকে সংস্করণ 2 প্রকাশ করেন।
  • আপনি কোন অগ্রাধিকার ছাড়াই একটি প্রোডাকশন ট্র্যাকে সংস্করণ 3 প্রকাশ করেন।

প্রোডাকশন ব্যবহারকারীরা যখন সংস্করণ 1 থেকে সংস্করণ 3 তে আপডেট করে, তখন তারা অগ্রাধিকার 5 পাবে, যদিও সংস্করণ 2 ভিন্ন ট্র্যাকে প্রকাশিত হয়েছিল।

কোটলিন

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.
    }
}

জাভা

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() ব্যবহার করে একটি আপডেটের অনুরোধ করতে পারেন :

কোটলিন

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())

জাভা

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 সেট করা আছে, তবে আপনি পরিবর্তে এটিকে true সেট করতে setAllowAssetPackDeletion() পদ্ধতি ব্যবহার করতে পারেন:

কোটলিন

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())

জাভা

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());

আপডেট স্থিতির জন্য একটি কলব্যাক পান

একটি আপডেট শুরু করার পরে, নিবন্ধিত কার্যকলাপ ফলাফল লঞ্চার কলব্যাক নিশ্চিতকরণ ডায়ালগ ফলাফল পায়:

কোটলিন

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.
    }
}

জাভা

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-তে অগ্রগতি প্রদর্শন করতে আপনার অ্যাপটিকে আপডেটের অবস্থা পর্যবেক্ষণ করতে হবে।

আপনি স্থিতি আপডেট ইনস্টল করার জন্য একজন শ্রোতা নিবন্ধন করে প্রগতিতে একটি আপডেটের অবস্থা নিরীক্ষণ করতে পারেন। ডাউনলোডের অগ্রগতি সম্পর্কে ব্যবহারকারীদের জানাতে আপনি অ্যাপের UI-তে একটি অগ্রগতি বারও প্রদান করতে পারেন।

কোটলিন

// 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)

জাভা

// 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 ইঙ্গিত) প্রদান করুন যাতে ব্যবহারকারীকে জানানো হয় যে আপডেটটি ইনস্টল করার জন্য প্রস্তুত এবং অ্যাপটি পুনরায় চালু করার আগে নিশ্চিতকরণের অনুরোধ করুন৷

নিম্নলিখিত উদাহরণটি একটি ম্যাটেরিয়াল ডিজাইন স্ন্যাকবার প্রয়োগ করা দেখায় যা অ্যাপটি পুনরায় চালু করার জন্য ব্যবহারকারীর কাছ থেকে নিশ্চিতকরণের অনুরোধ করে:

কোটলিন

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()
    }
}

জাভা

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 অবস্থায় একটি আপডেট থাকে, তাহলে ব্যবহারকারীকে আপডেটটি ইনস্টল করতে বলুন। অন্যথায়, আপডেট ডেটা ব্যবহারকারীর ডিভাইস স্টোরেজ দখল করতে থাকে।

কোটলিন

// 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()
            }
        }
}

জাভা

// 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 অবস্থায় স্থগিত হয়নি৷ যদি এই অবস্থায় আপডেটটি স্থগিত থাকে, আপডেটটি পুনরায় শুরু করুন:

কোটলিন

// 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())
            }
        }
}

জাভা

// 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 UI বন্ধ হয়ে যায়। আপনার অ্যাপটি এগিয়ে যাওয়ার সর্বোত্তম উপায় নির্ধারণ করা উচিত।

যদি সম্ভব হয়, ব্যবহারকারীকে আপডেট ছাড়াই চালিয়ে যেতে দিন এবং পরে আবার প্রম্পট করুন। যদি আপনার অ্যাপ আপডেট ছাড়া কাজ করতে না পারে, তাহলে আপডেট ফ্লো রিস্টার্ট করার আগে বা ব্যবহারকারীকে অ্যাপটি বন্ধ করার অনুরোধ জানানোর আগে একটি তথ্যপূর্ণ বার্তা প্রদর্শন করার কথা বিবেচনা করুন। এইভাবে, ব্যবহারকারী বুঝতে পারে যে তারা প্রয়োজনীয় আপডেট ইনস্টল করার জন্য প্রস্তুত হলে তারা আপনার অ্যাপ পুনরায় চালু করতে পারে।

পরবর্তী পদক্ষেপ

আপনার ইন্টিগ্রেশন সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে আপনার অ্যাপের ইন-অ্যাপ আপডেট পরীক্ষা করুন

,

কোটলিন বা জাভা ব্যবহার করে কীভাবে আপনার অ্যাপে অ্যাপ-মধ্যস্থ আপডেট সমর্থন করবেন তা এই নির্দেশিকাটি বর্ণনা করে। যে ক্ষেত্রে আপনার বাস্তবায়ন নেটিভ কোড (C/C++) ব্যবহার করে এবং যে ক্ষেত্রে আপনার বাস্তবায়ন ইউনিটি ব্যবহার করে তার জন্য আলাদা নির্দেশিকা রয়েছে।

আপনার উন্নয়ন পরিবেশ সেট আপ করুন

প্লে ইন-অ্যাপ আপডেট লাইব্রেরি হল Google Play কোর লাইব্রেরির একটি অংশ। প্লে ইন-অ্যাপ আপডেট লাইব্রেরি সংহত করতে অনুগ্রহ করে নিম্নলিখিত গ্রেডল নির্ভরতা অন্তর্ভুক্ত করুন।

গ্রোভি

// 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'
    ...
}

কোটলিন

// 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 ব্যবহার করুন:

কোটলিন

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.
    }
}

জাভা

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 উদাহরণে আপডেট উপলব্ধতার স্থিতি রয়েছে। আপডেটের অবস্থার উপর নির্ভর করে, উদাহরণে নিম্নলিখিতগুলিও রয়েছে:

  • যদি একটি আপডেট উপলব্ধ থাকে এবং আপডেটের অনুমতি দেওয়া হয়, উদাহরণটিতে আপডেটটি শুরু করার একটি অভিপ্রায়ও রয়েছে।
  • যদি একটি ইন-অ্যাপ আপডেট ইতিমধ্যেই প্রগতিতে থাকে, তাহলে ইনস্ট্যান্সটি ইন-প্রোগ্রেস আপডেটের অবস্থাও রিপোর্ট করে।

আপডেট অচলতা পরীক্ষা করুন

একটি আপডেট উপলব্ধ কিনা তা পরীক্ষা করার পাশাপাশি, আপনি প্লে স্টোরের মাধ্যমে ব্যবহারকারীকে সর্বশেষ আপডেটের বিষয়ে জানানোর পর থেকে কত সময় অতিবাহিত হয়েছে তাও পরীক্ষা করতে চাইতে পারেন। এটি আপনাকে সিদ্ধান্ত নিতে সাহায্য করতে পারে যে আপনি একটি নমনীয় আপডেট বা অবিলম্বে আপডেট শুরু করবেন কিনা। উদাহরণস্বরূপ, আপনি একটি নমনীয় আপডেটের সাথে ব্যবহারকারীকে অবহিত করার আগে কয়েক দিন অপেক্ষা করতে পারেন, এবং তার কয়েকদিন পরে একটি তাত্ক্ষণিক আপডেটের প্রয়োজন হওয়ার আগে।

প্লে স্টোরে আপডেটটি উপলব্ধ হওয়ার পর থেকে কত দিনের সংখ্যা পরীক্ষা করতে clientVersionStalenessDays() ব্যবহার করুন:

কোটলিন

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.
    }
}

জাভা

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 সর্বোচ্চ অগ্রাধিকার। একটি আপডেটের জন্য অগ্রাধিকার সেট করতে, Google Play Developer API-এ Edits.tracks.releases অধীনে inAppUpdatePriority ক্ষেত্রটি ব্যবহার করুন৷ রিলিজে সব নতুন-সংযোজিত সংস্করণকে রিলিজের মতোই অগ্রাধিকার হিসেবে বিবেচনা করা হয়। অগ্রাধিকার শুধুমাত্র একটি নতুন রিলিজ রোল আউট করার সময় সেট করা যেতে পারে এবং পরে পরিবর্তন করা যাবে না।

Play Developer API ডকুমেন্টেশনে বর্ণিত Google Play Developer API ব্যবহার করে অগ্রাধিকার সেট করুন। অ্যাপ-মধ্যস্থ আপডেট অগ্রাধিকার Edit.tracks Edit.tracks: update পদ্ধতিতে পাস করা Edit.tracks সম্পদে উল্লেখ করা উচিত। নিম্নলিখিত উদাহরণটি সংস্করণ কোড 88 এবং inAppUpdatePriority 5 সহ একটি অ্যাপ প্রকাশ করে:

{
  "releases": [{
      "versionCodes": ["88"],
      "inAppUpdatePriority": 5,
      "status": "completed"
  }]
}

আপনার অ্যাপের কোডে, আপনি updatePriority() ব্যবহার করে প্রদত্ত আপডেটের জন্য অগ্রাধিকার স্তর পরীক্ষা করতে পারেন। রিলিজ ট্র্যাক নির্বিশেষে, প্রত্যাবর্তিত অগ্রাধিকারটি ইনস্টল করা সংস্করণ এবং সর্বশেষ উপলব্ধ সংস্করণের মধ্যে সমস্ত অ্যাপ সংস্করণ কোডের জন্য inAppUpdatePriority বিবেচনা করে। উদাহরণস্বরূপ, নিম্নলিখিত দৃশ্যকল্প বিবেচনা করুন:

  • আপনি কোন অগ্রাধিকার ছাড়াই একটি প্রোডাকশন ট্র্যাকে সংস্করণ 1 প্রকাশ করেন।
  • আপনি অগ্রাধিকার 5 সহ একটি অভ্যন্তরীণ পরীক্ষা ট্র্যাকে সংস্করণ 2 প্রকাশ করেন।
  • আপনি কোন অগ্রাধিকার ছাড়াই একটি প্রোডাকশন ট্র্যাকে সংস্করণ 3 প্রকাশ করেন।

প্রোডাকশন ব্যবহারকারীরা যখন সংস্করণ 1 থেকে সংস্করণ 3 তে আপডেট করে, তখন তারা অগ্রাধিকার 5 পাবে, যদিও সংস্করণ 2 ভিন্ন ট্র্যাকে প্রকাশিত হয়েছিল।

কোটলিন

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.
    }
}

জাভা

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() ব্যবহার করে একটি আপডেটের অনুরোধ করতে পারেন :

কোটলিন

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())

জাভা

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 সেট করা আছে, তবে আপনি পরিবর্তে এটিকে true সেট করতে setAllowAssetPackDeletion() পদ্ধতি ব্যবহার করতে পারেন:

কোটলিন

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())

জাভা

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());

আপডেট স্থিতির জন্য একটি কলব্যাক পান

একটি আপডেট শুরু করার পরে, নিবন্ধিত কার্যকলাপ ফলাফল লঞ্চার কলব্যাক নিশ্চিতকরণ ডায়ালগ ফলাফল পায়:

কোটলিন

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.
    }
}

জাভা

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-তে অগ্রগতি প্রদর্শন করতে আপনার অ্যাপটিকে আপডেটের অবস্থা পর্যবেক্ষণ করতে হবে।

আপনি স্থিতি আপডেট ইনস্টল করার জন্য একজন শ্রোতা নিবন্ধন করে প্রগতিতে একটি আপডেটের অবস্থা নিরীক্ষণ করতে পারেন। ডাউনলোডের অগ্রগতি সম্পর্কে ব্যবহারকারীদের জানাতে আপনি অ্যাপের UI-তে একটি অগ্রগতি বারও প্রদান করতে পারেন।

কোটলিন

// 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)

জাভা

// 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 ইঙ্গিত) প্রদান করুন যাতে ব্যবহারকারীকে জানানো হয় যে আপডেটটি ইনস্টল করার জন্য প্রস্তুত এবং অ্যাপটি পুনরায় চালু করার আগে নিশ্চিতকরণের অনুরোধ করুন৷

নিম্নলিখিত উদাহরণটি একটি ম্যাটেরিয়াল ডিজাইন স্ন্যাকবার প্রয়োগ করা দেখায় যা অ্যাপটি পুনরায় চালু করার জন্য ব্যবহারকারীর কাছ থেকে নিশ্চিতকরণের অনুরোধ করে:

কোটলিন

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()
    }
}

জাভা

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 অবস্থায় একটি আপডেট থাকে, তাহলে ব্যবহারকারীকে আপডেটটি ইনস্টল করতে বলুন। অন্যথায়, আপডেট ডেটা ব্যবহারকারীর ডিভাইস স্টোরেজ দখল করতে থাকে।

কোটলিন

// 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()
            }
        }
}

জাভা

// 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 অবস্থায় স্থগিত হয়নি৷ যদি এই অবস্থায় আপডেটটি স্থগিত থাকে, আপডেটটি পুনরায় শুরু করুন:

কোটলিন

// 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())
            }
        }
}

জাভা

// 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 UI বন্ধ হয়ে যায়। আপনার অ্যাপটি এগিয়ে যাওয়ার সর্বোত্তম উপায় নির্ধারণ করা উচিত।

যদি সম্ভব হয়, ব্যবহারকারীকে আপডেট ছাড়াই চালিয়ে যেতে দিন এবং পরে আবার প্রম্পট করুন। যদি আপনার অ্যাপ আপডেট ছাড়া কাজ করতে না পারে, তাহলে আপডেট ফ্লো রিস্টার্ট করার আগে বা ব্যবহারকারীকে অ্যাপটি বন্ধ করার অনুরোধ জানানোর আগে একটি তথ্যপূর্ণ বার্তা প্রদর্শন করার কথা বিবেচনা করুন। এইভাবে, ব্যবহারকারী বুঝতে পারে যে তারা প্রয়োজনীয় আপডেট ইনস্টল করার জন্য প্রস্তুত হলে তারা আপনার অ্যাপ পুনরায় চালু করতে পারে।

পরবর্তী পদক্ষেপ

আপনার ইন্টিগ্রেশন সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে আপনার অ্যাপের ইন-অ্যাপ আপডেট পরীক্ষা করুন

,

কোটলিন বা জাভা ব্যবহার করে কীভাবে আপনার অ্যাপে অ্যাপ-মধ্যস্থ আপডেট সমর্থন করবেন তা এই নির্দেশিকাটি বর্ণনা করে। যে ক্ষেত্রে আপনার বাস্তবায়ন নেটিভ কোড (C/C++) ব্যবহার করে এবং যে ক্ষেত্রে আপনার বাস্তবায়ন ইউনিটি ব্যবহার করে তার জন্য আলাদা নির্দেশিকা রয়েছে।

আপনার উন্নয়ন পরিবেশ সেট আপ করুন

প্লে ইন-অ্যাপ আপডেট লাইব্রেরি হল Google Play কোর লাইব্রেরির একটি অংশ। প্লে ইন-অ্যাপ আপডেট লাইব্রেরি সংহত করতে অনুগ্রহ করে নিম্নলিখিত গ্রেডল নির্ভরতা অন্তর্ভুক্ত করুন।

গ্রোভি

// 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'
    ...
}

কোটলিন

// 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 ব্যবহার করুন:

কোটলিন

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.
    }
}

জাভা

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 উদাহরণে আপডেট উপলব্ধতার স্থিতি রয়েছে। আপডেটের অবস্থার উপর নির্ভর করে, উদাহরণে নিম্নলিখিতগুলিও রয়েছে:

  • যদি একটি আপডেট উপলব্ধ থাকে এবং আপডেটের অনুমতি দেওয়া হয়, উদাহরণটিতে আপডেটটি শুরু করার একটি অভিপ্রায়ও রয়েছে।
  • যদি একটি ইন-অ্যাপ আপডেট ইতিমধ্যেই প্রগতিতে থাকে, তাহলে ইনস্ট্যান্সটি ইন-প্রোগ্রেস আপডেটের অবস্থাও রিপোর্ট করে।

আপডেট অচলতা পরীক্ষা করুন

একটি আপডেট উপলব্ধ কিনা তা পরীক্ষা করার পাশাপাশি, আপনি প্লে স্টোরের মাধ্যমে ব্যবহারকারীকে সর্বশেষ আপডেটের বিষয়ে জানানোর পর থেকে কত সময় অতিবাহিত হয়েছে তাও পরীক্ষা করতে চাইতে পারেন। এটি আপনাকে সিদ্ধান্ত নিতে সাহায্য করতে পারে যে আপনি একটি নমনীয় আপডেট বা অবিলম্বে আপডেট শুরু করবেন কিনা। উদাহরণস্বরূপ, আপনি একটি নমনীয় আপডেটের সাথে ব্যবহারকারীকে অবহিত করার আগে কয়েক দিন অপেক্ষা করতে পারেন, এবং তার কয়েকদিন পরে একটি তাত্ক্ষণিক আপডেটের প্রয়োজন হওয়ার আগে।

প্লে স্টোরে আপডেটটি উপলব্ধ হওয়ার পর থেকে কত দিনের সংখ্যা পরীক্ষা করতে clientVersionStalenessDays() ব্যবহার করুন:

কোটলিন

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.
    }
}

জাভা

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 সর্বোচ্চ অগ্রাধিকার। একটি আপডেটের জন্য অগ্রাধিকার সেট করতে, Google Play Developer API-এ Edits.tracks.releases অধীনে inAppUpdatePriority ক্ষেত্রটি ব্যবহার করুন৷ রিলিজে সব নতুন-সংযোজিত সংস্করণকে রিলিজের মতোই অগ্রাধিকার হিসেবে বিবেচনা করা হয়। অগ্রাধিকার শুধুমাত্র একটি নতুন রিলিজ রোল আউট করার সময় সেট করা যেতে পারে এবং পরে পরিবর্তন করা যাবে না।

Play Developer API ডকুমেন্টেশনে বর্ণিত Google Play Developer API ব্যবহার করে অগ্রাধিকার সেট করুন। অ্যাপ-মধ্যস্থ আপডেট অগ্রাধিকার Edit.tracks Edit.tracks: update পদ্ধতিতে পাস করা Edit.tracks সম্পদে উল্লেখ করা উচিত। নিম্নলিখিত উদাহরণটি সংস্করণ কোড 88 এবং inAppUpdatePriority 5 সহ একটি অ্যাপ প্রকাশ করে:

{
  "releases": [{
      "versionCodes": ["88"],
      "inAppUpdatePriority": 5,
      "status": "completed"
  }]
}

আপনার অ্যাপের কোডে, আপনি updatePriority() ব্যবহার করে প্রদত্ত আপডেটের জন্য অগ্রাধিকার স্তর পরীক্ষা করতে পারেন। রিলিজ ট্র্যাক নির্বিশেষে, প্রত্যাবর্তিত অগ্রাধিকারটি ইনস্টল করা সংস্করণ এবং সর্বশেষ উপলব্ধ সংস্করণের মধ্যে সমস্ত অ্যাপ সংস্করণ কোডের জন্য inAppUpdatePriority বিবেচনা করে। উদাহরণস্বরূপ, নিম্নলিখিত দৃশ্যকল্প বিবেচনা করুন:

  • আপনি কোন অগ্রাধিকার ছাড়াই একটি প্রোডাকশন ট্র্যাকে সংস্করণ 1 প্রকাশ করেন।
  • আপনি অগ্রাধিকার 5 সহ একটি অভ্যন্তরীণ পরীক্ষা ট্র্যাকে সংস্করণ 2 প্রকাশ করেন।
  • আপনি কোন অগ্রাধিকার ছাড়াই একটি প্রোডাকশন ট্র্যাকে সংস্করণ 3 প্রকাশ করেন।

প্রোডাকশন ব্যবহারকারীরা যখন সংস্করণ 1 থেকে সংস্করণ 3 তে আপডেট করে, তখন তারা অগ্রাধিকার 5 পাবে, যদিও সংস্করণ 2 ভিন্ন ট্র্যাকে প্রকাশিত হয়েছিল।

কোটলিন

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.
    }
}

জাভা

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() ব্যবহার করে একটি আপডেটের অনুরোধ করতে পারেন :

কোটলিন

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())

জাভা

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 সেট করা আছে, তবে আপনি পরিবর্তে এটিকে true সেট করতে setAllowAssetPackDeletion() পদ্ধতি ব্যবহার করতে পারেন:

কোটলিন

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())

জাভা

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());

আপডেট স্থিতির জন্য একটি কলব্যাক পান

একটি আপডেট শুরু করার পরে, নিবন্ধিত কার্যকলাপ ফলাফল লঞ্চার কলব্যাক নিশ্চিতকরণ ডায়ালগ ফলাফল পায়:

কোটলিন

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.
    }
}

জাভা

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-তে অগ্রগতি প্রদর্শন করতে আপনার অ্যাপটিকে আপডেটের অবস্থা পর্যবেক্ষণ করতে হবে।

আপনি স্থিতি আপডেট ইনস্টল করার জন্য একজন শ্রোতা নিবন্ধন করে প্রগতিতে একটি আপডেটের অবস্থা নিরীক্ষণ করতে পারেন। ডাউনলোডের অগ্রগতি সম্পর্কে ব্যবহারকারীদের জানাতে আপনি অ্যাপের UI-তে একটি অগ্রগতি বারও প্রদান করতে পারেন।

কোটলিন

// 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)

জাভা

// 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 ইঙ্গিত) প্রদান করুন যাতে ব্যবহারকারীকে জানানো হয় যে আপডেটটি ইনস্টল করার জন্য প্রস্তুত এবং অ্যাপটি পুনরায় চালু করার আগে নিশ্চিতকরণের অনুরোধ করুন৷

নিম্নলিখিত উদাহরণটি একটি ম্যাটেরিয়াল ডিজাইন স্ন্যাকবার প্রয়োগ করা দেখায় যা অ্যাপটি পুনরায় চালু করার জন্য ব্যবহারকারীর কাছ থেকে নিশ্চিতকরণের অনুরোধ করে:

কোটলিন

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()
    }
}

জাভা

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 অবস্থায় একটি আপডেট থাকে, তাহলে ব্যবহারকারীকে আপডেটটি ইনস্টল করতে বলুন। অন্যথায়, আপডেট ডেটা ব্যবহারকারীর ডিভাইস স্টোরেজ দখল করতে থাকে।

কোটলিন

// 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()
            }
        }
}

জাভা

// 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 অবস্থায় স্থগিত হয়নি৷ যদি এই অবস্থায় আপডেটটি স্থগিত থাকে, আপডেটটি পুনরায় শুরু করুন:

কোটলিন

// 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())
            }
        }
}

জাভা

// 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 UI বন্ধ হয়ে যায়। আপনার অ্যাপটি এগিয়ে যাওয়ার সর্বোত্তম উপায় নির্ধারণ করা উচিত।

যদি সম্ভব হয়, ব্যবহারকারীকে আপডেট ছাড়াই চালিয়ে যেতে দিন এবং পরে আবার প্রম্পট করুন। যদি আপনার অ্যাপ আপডেট ছাড়া কাজ করতে না পারে, তাহলে আপডেট ফ্লো রিস্টার্ট করার আগে বা ব্যবহারকারীকে অ্যাপটি বন্ধ করার অনুরোধ জানানোর আগে একটি তথ্যপূর্ণ বার্তা প্রদর্শন করার কথা বিবেচনা করুন। এইভাবে, ব্যবহারকারী বুঝতে পারে যে তারা প্রয়োজনীয় আপডেট ইনস্টল করার জন্য প্রস্তুত হলে তারা আপনার অ্যাপ পুনরায় চালু করতে পারে।

পরবর্তী পদক্ষেপ

আপনার ইন্টিগ্রেশন সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে আপনার অ্যাপের ইন-অ্যাপ আপডেট পরীক্ষা করুন

,

কোটলিন বা জাভা ব্যবহার করে কীভাবে আপনার অ্যাপে অ্যাপ-মধ্যস্থ আপডেট সমর্থন করবেন তা এই নির্দেশিকাটি বর্ণনা করে। যে ক্ষেত্রে আপনার বাস্তবায়ন নেটিভ কোড (C/C++) ব্যবহার করে এবং যে ক্ষেত্রে আপনার বাস্তবায়ন ইউনিটি ব্যবহার করে তার জন্য আলাদা নির্দেশিকা রয়েছে।

আপনার উন্নয়ন পরিবেশ সেট আপ করুন

প্লে ইন-অ্যাপ আপডেট লাইব্রেরি হল Google Play কোর লাইব্রেরির একটি অংশ। প্লে ইন-অ্যাপ আপডেট লাইব্রেরি সংহত করতে অনুগ্রহ করে নিম্নলিখিত গ্রেডল নির্ভরতা অন্তর্ভুক্ত করুন।

গ্রোভি

// 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'
    ...
}

কোটলিন

// 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 ব্যবহার করুন:

কোটলিন

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.
    }
}

জাভা

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 উদাহরণে আপডেট উপলব্ধতার স্থিতি রয়েছে। আপডেটের অবস্থার উপর নির্ভর করে, উদাহরণে নিম্নলিখিতগুলিও রয়েছে:

  • যদি একটি আপডেট উপলব্ধ থাকে এবং আপডেটের অনুমতি দেওয়া হয়, উদাহরণটিতে আপডেটটি শুরু করার একটি অভিপ্রায়ও রয়েছে।
  • যদি একটি ইন-অ্যাপ আপডেট ইতিমধ্যেই প্রগতিতে থাকে, তাহলে ইনস্ট্যান্সটি ইন-প্রোগ্রেস আপডেটের অবস্থাও রিপোর্ট করে।

আপডেট অচলতা পরীক্ষা করুন

একটি আপডেট উপলব্ধ কিনা তা পরীক্ষা করার পাশাপাশি, আপনি প্লে স্টোরের মাধ্যমে ব্যবহারকারীকে সর্বশেষ আপডেটের বিষয়ে জানানোর পর থেকে কত সময় অতিবাহিত হয়েছে তাও পরীক্ষা করতে চাইতে পারেন। এটি আপনাকে সিদ্ধান্ত নিতে সাহায্য করতে পারে যে আপনি একটি নমনীয় আপডেট বা অবিলম্বে আপডেট শুরু করবেন কিনা। উদাহরণস্বরূপ, আপনি একটি নমনীয় আপডেটের সাথে ব্যবহারকারীকে অবহিত করার আগে কয়েক দিন অপেক্ষা করতে পারেন, এবং তার কয়েকদিন পরে একটি তাত্ক্ষণিক আপডেটের প্রয়োজন হওয়ার আগে।

প্লে স্টোরে আপডেটটি উপলব্ধ হওয়ার পর থেকে কত দিনের সংখ্যা পরীক্ষা করতে clientVersionStalenessDays() ব্যবহার করুন:

কোটলিন

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.
    }
}

জাভা

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 সর্বোচ্চ অগ্রাধিকার। একটি আপডেটের জন্য অগ্রাধিকার সেট করতে, Google Play Developer API-এ Edits.tracks.releases অধীনে inAppUpdatePriority ক্ষেত্রটি ব্যবহার করুন৷ রিলিজে সব নতুন-সংযোজিত সংস্করণকে রিলিজের মতোই অগ্রাধিকার হিসেবে বিবেচনা করা হয়। অগ্রাধিকার শুধুমাত্র একটি নতুন রিলিজ রোল আউট করার সময় সেট করা যেতে পারে এবং পরে পরিবর্তন করা যাবে না।

Play Developer API ডকুমেন্টেশনে বর্ণিত Google Play Developer API ব্যবহার করে অগ্রাধিকার সেট করুন। অ্যাপ-মধ্যস্থ আপডেট অগ্রাধিকার Edit.tracks Edit.tracks: update পদ্ধতিতে পাস করা Edit.tracks সম্পদে উল্লেখ করা উচিত। নিম্নলিখিত উদাহরণটি সংস্করণ কোড 88 এবং inAppUpdatePriority 5 সহ একটি অ্যাপ প্রকাশ করে:

{
  "releases": [{
      "versionCodes": ["88"],
      "inAppUpdatePriority": 5,
      "status": "completed"
  }]
}

আপনার অ্যাপের কোডে, আপনি updatePriority() ব্যবহার করে প্রদত্ত আপডেটের জন্য অগ্রাধিকার স্তর পরীক্ষা করতে পারেন। রিলিজ ট্র্যাক নির্বিশেষে, প্রত্যাবর্তিত অগ্রাধিকারটি ইনস্টল করা সংস্করণ এবং সর্বশেষ উপলব্ধ সংস্করণের মধ্যে সমস্ত অ্যাপ সংস্করণ কোডের জন্য inAppUpdatePriority বিবেচনা করে। উদাহরণস্বরূপ, নিম্নলিখিত দৃশ্যকল্প বিবেচনা করুন:

  • আপনি কোন অগ্রাধিকার ছাড়াই একটি প্রোডাকশন ট্র্যাকে সংস্করণ 1 প্রকাশ করেন।
  • আপনি অগ্রাধিকার 5 সহ একটি অভ্যন্তরীণ পরীক্ষা ট্র্যাকে সংস্করণ 2 প্রকাশ করেন।
  • আপনি কোন অগ্রাধিকার ছাড়াই একটি প্রোডাকশন ট্র্যাকে সংস্করণ 3 প্রকাশ করেন।

প্রোডাকশন ব্যবহারকারীরা যখন সংস্করণ 1 থেকে সংস্করণ 3 তে আপডেট করে, তখন তারা অগ্রাধিকার 5 পাবে, যদিও সংস্করণ 2 ভিন্ন ট্র্যাকে প্রকাশিত হয়েছিল।

কোটলিন

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.
    }
}

জাভা

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() ব্যবহার করে একটি আপডেটের অনুরোধ করতে পারেন :

কোটলিন

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())

জাভা

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 সেট করা আছে, তবে আপনি পরিবর্তে এটিকে true সেট করতে setAllowAssetPackDeletion() পদ্ধতি ব্যবহার করতে পারেন:

কোটলিন

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())

জাভা

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());

আপডেট স্থিতির জন্য একটি কলব্যাক পান

একটি আপডেট শুরু করার পরে, নিবন্ধিত কার্যকলাপ ফলাফল লঞ্চার কলব্যাক নিশ্চিতকরণ ডায়ালগ ফলাফল পায়:

কোটলিন

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.
    }
}

জাভা

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-তে অগ্রগতি প্রদর্শন করতে আপনার অ্যাপটিকে আপডেটের অবস্থা পর্যবেক্ষণ করতে হবে।

আপনি স্থিতি আপডেট ইনস্টল করার জন্য একজন শ্রোতা নিবন্ধন করে প্রগতিতে একটি আপডেটের অবস্থা নিরীক্ষণ করতে পারেন। ডাউনলোডের অগ্রগতি সম্পর্কে ব্যবহারকারীদের জানাতে আপনি অ্যাপের UI-তে একটি অগ্রগতি বারও প্রদান করতে পারেন।

কোটলিন

// 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)

জাভা

// 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 ইঙ্গিত) প্রদান করুন যাতে ব্যবহারকারীকে জানানো হয় যে আপডেটটি ইনস্টল করার জন্য প্রস্তুত এবং অ্যাপটি পুনরায় চালু করার আগে নিশ্চিতকরণের অনুরোধ করুন৷

নিম্নলিখিত উদাহরণটি একটি ম্যাটেরিয়াল ডিজাইন স্ন্যাকবার প্রয়োগ করা দেখায় যা অ্যাপটি পুনরায় চালু করার জন্য ব্যবহারকারীর কাছ থেকে নিশ্চিতকরণের অনুরোধ করে:

কোটলিন

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()
    }
}

জাভা

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 অবস্থায় একটি আপডেট থাকে, তাহলে ব্যবহারকারীকে আপডেটটি ইনস্টল করতে বলুন। অন্যথায়, আপডেট ডেটা ব্যবহারকারীর ডিভাইস স্টোরেজ দখল করতে থাকে।

কোটলিন

// 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()
            }
        }
}

জাভা

// 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 অবস্থায় স্থগিত হয়নি৷ যদি এই অবস্থায় আপডেটটি স্থগিত থাকে, আপডেটটি পুনরায় শুরু করুন:

কোটলিন

// 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())
            }
        }
}

জাভা

// 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 UI বন্ধ হয়ে যায়। আপনার অ্যাপটি এগিয়ে যাওয়ার সর্বোত্তম উপায় নির্ধারণ করা উচিত।

যদি সম্ভব হয়, ব্যবহারকারীকে আপডেট ছাড়াই চালিয়ে যেতে দিন এবং পরে আবার প্রম্পট করুন। যদি আপনার অ্যাপ আপডেট ছাড়া কাজ করতে না পারে, তাহলে আপডেট ফ্লো রিস্টার্ট করার আগে বা ব্যবহারকারীকে অ্যাপটি বন্ধ করার অনুরোধ জানানোর আগে একটি তথ্যপূর্ণ বার্তা প্রদর্শন করার কথা বিবেচনা করুন। এইভাবে, ব্যবহারকারী বুঝতে পারে যে তারা প্রয়োজনীয় আপডেট ইনস্টল করার জন্য প্রস্তুত হলে তারা আপনার অ্যাপ পুনরায় চালু করতে পারে।

পরবর্তী পদক্ষেপ

আপনার ইন্টিগ্রেশন সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে আপনার অ্যাপের ইন-অ্যাপ আপডেট পরীক্ষা করুন