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

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

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

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

গ্রুভি

// 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.
    }
});

আপডেট অগ্রাধিকার পরীক্ষা করুন

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

  • ছোটখাটো UI উন্নতি: এটি একটি কম-অগ্রাধিকারের আপডেট; এর জন্য নমনীয় বা তাৎক্ষণিক কোনো আপডেটের অনুরোধ করবেন না। শুধুমাত্র তখনই আপডেট করুন যখন ব্যবহারকারী আপনার অ্যাপের সাথে কোনো মিথস্ক্রিয়া করছেন না।
  • কর্মক্ষমতার উন্নতি: মধ্যম-অগ্রাধিকারের আপডেট; একটি নমনীয় আপডেটের জন্য অনুরোধ করুন।
  • গুরুত্বপূর্ণ নিরাপত্তা আপডেট: উচ্চ-অগ্রাধিকারের আপডেট; অবিলম্বে আপডেটের জন্য অনুরোধ করুন।

অগ্রাধিকার নির্ধারণ করতে, গুগল প্লে ০ থেকে ৫-এর মধ্যে একটি পূর্ণসংখ্যা ব্যবহার করে, যেখানে ০ হলো ডিফল্ট এবং ৫ হলো সর্বোচ্চ অগ্রাধিকার। কোনো আপডেটের জন্য অগ্রাধিকার সেট করতে, গুগল প্লে ডেভেলপার এপিআই-এর Edits.tracks.releases অধীনে থাকা inAppUpdatePriority ফিল্ডটি ব্যবহার করুন। রিলিজে নতুন যোগ করা সমস্ত সংস্করণকে রিলিজটির সমান অগ্রাধিকার দেওয়া হয়। অগ্রাধিকার শুধুমাত্র একটি নতুন রিলিজ চালু করার সময় সেট করা যায় এবং পরে তা পরিবর্তন করা যায় না।

প্লে ডেভেলপার এপিআই ডকুমেন্টেশনে বর্ণিত পদ্ধতি অনুযায়ী গুগল প্লে ডেভেলপার এপিআই ব্যবহার করে প্রায়োরিটি সেট করুন। ইন-অ্যাপ আপডেটের প্রায়োরিটি, Edit.tracks Edit.tracks: update রিসোর্সে নির্দিষ্ট করতে হবে। নিচের উদাহরণটিতে ভার্সন কোড ৮৮ এবং inAppUpdatePriority 5 সহ একটি অ্যাপ রিলিজ করার পদ্ধতি দেখানো হলো:

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

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

  • আপনি ভার্সন ১-কে কোনো প্রায়োরিটি ছাড়াই একটি প্রোডাকশন ট্র্যাকে রিলিজ করেন।
  • আপনি প্রায়োরিটি ৫ দিয়ে ভার্সন ২ একটি অভ্যন্তরীণ টেস্ট ট্র্যাকে রিলিজ করেন।
  • আপনি ভার্সন ৩-কে কোনো প্রায়োরিটি ছাড়াই একটি প্রোডাকশন ট্র্যাকে রিলিজ করেন।

যখন প্রোডাকশন ব্যবহারকারীরা ভার্সন ১ থেকে ভার্সন ৩-এ আপডেট করবেন, তখন তাঁরা প্রায়োরিটি ৫ পাবেন, যদিও ভার্সন ২ একটি ভিন্ন ট্র্যাকে প্রকাশিত হয়েছিল।

কোটলিন

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

কোটলিন

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

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

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

একটি তাৎক্ষণিক আপডেট পরিচালনা করুন

যখন আপনি একটি তাৎক্ষণিক আপডেট শুরু করেন এবং ব্যবহারকারী আপডেটটি শুরু করতে সম্মতি দেন, তখন গুগল প্লে আপডেটের পুরো সময় জুড়ে আপনার অ্যাপের 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() এর রেফারেন্স ডকুমেন্টেশনে বর্ণিত পদ্ধতি অনুযায়ী আপডেট ফ্লো একটি ফলাফল প্রদান করে। বিশেষ করে, ব্যবহারকারী যখন আপডেটটি প্রত্যাখ্যান করেন বা ডাউনলোড বাতিল করেন, তখন আপনার অ্যাপের সেই পরিস্থিতি সামাল দেওয়ার সক্ষমতা থাকা উচিত। ব্যবহারকারী যখন এই দুটি কাজের মধ্যে যেকোনো একটি করেন, তখন গুগল প্লে UI বন্ধ হয়ে যায়। এক্ষেত্রে পরবর্তী পদক্ষেপের জন্য সবচেয়ে ভালো উপায়টি আপনার অ্যাপের নির্ধারণ করা উচিত।

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

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

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