অ্যাপ-মধ্যস্থ আপডেট সমর্থন করুন (ইউনিটি)

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

ইউনিটি এসডিকে ওভারভিউ

প্লে ইন-অ্যাপ আপডেট এপিআই হলো প্লে কোর এসডিকে পরিবারের একটি অংশ। ইউনিটি প্লাগইনটি আপনার অ্যাপ এবং গুগল প্লে এপিআই-এর মধ্যে যোগাযোগ পরিচালনার জন্য একটি AppUpdateManager ক্লাস প্রদান করে। ইন-অ্যাপ আপডেটগুলি পরিচালনা করার জন্য এটি ব্যবহার করার আগে আপনাকে অবশ্যই এই ক্লাসটি ইনস্ট্যানশিয়েট করতে হবে:

AppUpdateManager appUpdateManager = new AppUpdateManager();

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

ওপেনইউপিএম-সিএলআই

আপনার যদি OpenUPM CLI ইনস্টল করা থাকে, তাহলে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে OpenUPM রেজিস্ট্রি ইনস্টল করতে পারেন:

openupm add com.google.play.appupdate

ওপেনইউপিএম

  1. ইউনিটি মেনু অপশন Edit > Project Settings > Package Manager নির্বাচন করে প্যাকেজ ম্যানেজার সেটিংস খুলুন।

  2. প্যাকেজ ম্যানেজার উইন্ডোতে OpenUPM-কে একটি স্কোপড রেজিস্ট্রি হিসেবে যুক্ত করুন:

    Name: package.openupm.com
    URL: https://package.openupm.com
    Scopes: com.google.external-dependency-manager
      com.google.play.common
      com.google.play.core
      com.google.play.appupdate
    
  3. ইউনিটি মেনু অপশন Window > Package Manager নির্বাচন করে প্যাকেজ ম্যানেজার মেনুটি খুলুন।

  4. ম্যানেজার স্কোপ ড্রপ-ডাউন থেকে 'আমার রেজিস্ট্রি' নির্বাচন করুন।

  5. প্যাকেজ তালিকা থেকে ইউনিটির জন্য গুগল প্লে ইন্টিগ্রিটি প্লাগইন প্যাকেজটি নির্বাচন করুন এবং ইনস্টল চাপুন।

গিটহাব থেকে আমদানি করুন

  1. গিটহাব থেকে সর্বশেষ .unitypackage রিলিজটি ডাউনলোড করুন।

  2. ইউনিটি মেনু অপশন Assets > Import package > Custom Package নির্বাচন করে সমস্ত আইটেম ইম্পোর্ট করার মাধ্যমে .unitypackage ফাইলটি ইম্পোর্ট করুন।

আপডেটের প্রাপ্যতা যাচাই করুন

আপডেটের অনুরোধ করার আগে, আপনার অ্যাপের জন্য কোনো আপডেট আছে কিনা তা পরীক্ষা করে দেখুন। একটি কো-রুটিনে আপডেট পরীক্ষা করার জন্য AppUpdateManager ব্যবহার করুন:

IEnumerator CheckForUpdate()
{
  PlayAsyncOperation<AppUpdateInfo, AppUpdateErrorCode> appUpdateInfoOperation =
    appUpdateManager.GetAppUpdateInfo();

  // Wait until the asynchronous operation completes.
  yield return appUpdateInfoOperation;

  if (appUpdateInfoOperation.IsSuccessful)
  {
    var appUpdateInfoResult = appUpdateInfoOperation.GetResult();
    // Check AppUpdateInfo's UpdateAvailability, UpdatePriority,
    // IsUpdateTypeAllowed(), ... and decide whether to ask the user
    // to start an in-app update.
  }
  else
  {
    // Log appUpdateInfoOperation.Error.
  }
}

ফেরত আসা AppUpdateInfo ইনস্ট্যান্সটিতে আপডেটের উপলব্ধতার স্থিতি থাকে। যদি অ্যাপের মধ্যে কোনো আপডেট আগে থেকেই চলমান থাকে, তাহলে ইনস্ট্যান্সটি সেই চলমান আপডেটের স্থিতিও জানায়।

আপডেট পুরোনো হয়ে গেছে কিনা তা পরীক্ষা করুন

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

প্লে স্টোরের মাধ্যমে আপডেটটি উপলব্ধ হওয়ার পর থেকে কত দিন অতিবাহিত হয়েছে তা জানতে ClientVersionStalenessDays ব্যবহার করুন:

var stalenessDays = appUpdateInfoOperation.ClientVersionStalenessDays;

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

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

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

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

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

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

আপনার অ্যাপের কোডে, আপনি UpdatePriority ব্যবহার করে কোনো নির্দিষ্ট আপডেটের অগ্রাধিকার স্তর পরীক্ষা করতে পারেন:

var priority = appUpdateInfoOperation.UpdatePriority;

একটি আপডেট শুরু করুন

আপডেট উপলব্ধ আছে কিনা তা নিশ্চিত করার পর, আপনি AppUpdateManager.StartUpdate() ব্যবহার করে আপডেটের জন্য অনুরোধ করতে পারেন। আপডেটের অনুরোধ করার আগে, নিশ্চিত করুন যে আপনার কাছে একটি হালনাগাদ AppUpdateInfo অবজেক্ট আছে। আপডেট প্রবাহ কনফিগার করার জন্য আপনাকে অবশ্যই একটি AppUpdateOptions অবজেক্টও তৈরি করতে হবে।

নিম্নলিখিত উদাহরণটি একটি তাৎক্ষণিক আপডেট ফ্লো-এর জন্য একটি AppUpdateOptions অবজেক্ট তৈরি করে:

// Creates an AppUpdateOptions defining an immediate in-app
// update flow and its parameters.
var appUpdateOptions = AppUpdateOptions.ImmediateAppUpdateOptions();

নিম্নলিখিত উদাহরণটি একটি নমনীয় আপডেট প্রবাহের জন্য একটি AppUpdateOptions অবজেক্ট তৈরি করে:

// Creates an AppUpdateOptions defining a flexible in-app
// update flow and its parameters.
var appUpdateOptions = AppUpdateOptions.FlexibleAppUpdateOptions();

AppUpdateOptions অবজেক্টটিতে একটি AllowAssetPackDeletion ফিল্ডও থাকে, যা নির্ধারণ করে যে ডিভাইসের স্টোরেজ সীমিত থাকলে আপডেটটি অ্যাসেট প্যাক মুছে ফেলার অনুমতি দেবে কি না। এই ফিল্ডটি ডিফল্টরূপে false সেট করা থাকে, কিন্তু আপনি ImmediateAppUpdateOptions() বা FlexibleAppUpdateOptions() ফাংশনে allowAssetPackDeletion ঐচ্ছিক আর্গুমেন্টটি পাস করে এটিকে true সেট করতে পারেন।

// Creates an AppUpdateOptions for an immediate flow that allows
// asset pack deletion.
var appUpdateOptions =
  AppUpdateOptions.ImmediateAppUpdateOptions(allowAssetPackDeletion: true);

// Creates an AppUpdateOptions for a flexible flow that allows asset
// pack deletion.
var appUpdateOptions =
  AppUpdateOptions.FlexibleAppUpdateOptions(allowAssetPackDeletion: true);

আপনি নমনীয় আপডেট নাকি তাৎক্ষণিক আপডেট চাইছেন, তার ওপর পরবর্তী পদক্ষেপগুলো নির্ভর করবে।

একটি নমনীয় আপডেট পরিচালনা করুন

আপনার কাছে একটি হালনাগাদ AppUpdateInfo অবজেক্ট এবং একটি সঠিকভাবে কনফিগার করা AppUpdateOptions অবজেক্ট থাকলে, আপনি অ্যাসিঙ্ক্রোনাসভাবে একটি আপডেট ফ্লো-এর অনুরোধ করতে AppUpdateManager.StartUpdate() কল করতে পারেন।

IEnumerator StartFlexibleUpdate()
{
  // Creates an AppUpdateRequest that can be used to monitor the
  // requested in-app update flow.
  var startUpdateRequest = appUpdateManager.StartUpdate(
    // The result returned by PlayAsyncOperation.GetResult().
    appUpdateInfoResult,
    // The AppUpdateOptions created defining the requested in-app update
    // and its parameters.
    appUpdateOptions);

  while (!startUpdateRequest.IsDone)
  {
  // For flexible flow,the user can continue to use the app while
  // the update downloads in the background. You can implement a
  // progress bar showing the download status during this time.
  yield return null;
  }

}

একটি নমনীয় আপডেট প্রবাহের জন্য, ডাউনলোড সফলভাবে সম্পন্ন হওয়ার পর আপনাকে অবশ্যই অ্যাপ আপডেটের ইনস্টলেশন শুরু করতে হবে। এটি করার জন্য, AppUpdateManager.CompleteUpdate() কল করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

IEnumerator CompleteFlexibleUpdate()
{
  var result = appUpdateManager.CompleteUpdate();
  yield return result;

  // If the update completes successfully, then the app restarts and this line
  // is never reached. If this line is reached, then handle the failure (e.g. by
  // logging result.Error or by displaying a message to the user).
}

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

আপনার কাছে একটি হালনাগাদ AppUpdateInfo অবজেক্ট এবং একটি সঠিকভাবে কনফিগার করা AppUpdateOptions অবজেক্ট থাকলে, আপনি অ্যাসিঙ্ক্রোনাসভাবে একটি আপডেট ফ্লো-এর অনুরোধ করতে AppUpdateManager.StartUpdate() কল করতে পারেন।

IEnumerator StartImmediateUpdate()
{
  // Creates an AppUpdateRequest that can be used to monitor the
  // requested in-app update flow.
  var startUpdateRequest = appUpdateManager.StartUpdate(
    // The result returned by PlayAsyncOperation.GetResult().
    appUpdateInfoResult,
    // The AppUpdateOptions created defining the requested in-app update
    // and its parameters.
    appUpdateOptions);
  yield return startUpdateRequest;

  // If the update completes successfully, then the app restarts and this line
  // is never reached. If this line is reached, then handle the failure (for
  // example, by logging result.Error or by displaying a message to the user).
}

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

ত্রুটি পরিচালনা

এই অংশে সাধারণ ভুলগুলোর সমাধান বর্ণনা করা হয়েছে।

  • যদি StartUpdate() একটি ArgumentNullException থ্রো করে, তার মানে হলো AppUpdateInfo মান null। আপডেট ফ্লো শুরু করার আগে নিশ্চিত হয়ে নিন যে GetAppUpdateInfo() থেকে রিটার্ন করা AppUpdateInfo অবজেক্টটি null নয়।
  • যদি PlayAsyncOperation ErrorUpdateUnavailable এরর কোডটি রিটার্ন করে, তাহলে নিশ্চিত করুন যে একই অ্যাপ্লিকেশন আইডি এবং সাইনিং কী সহ একটি আপডেট করা অ্যাপ সংস্করণ উপলব্ধ আছে।
  • যদি PlayAsyncOperation ErrorUpdateNotAllowed এরর কোডটি রিটার্ন করে, তার মানে হলো AppUpdateOptions অবজেক্টটি এমন একটি আপডেট টাইপ নির্দেশ করছে যা উপলব্ধ আপডেটের জন্য অনুমোদিত নয়। আপডেট ফ্লো শুরু করার আগে যাচাই করে নিন যে AppUpdateInfo অবজেক্টটি নির্দেশ করছে কিনা যে নির্বাচিত আপডেট টাইপটি অনুমোদিত।

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

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