অ্যাপ-মধ্যস্থ আপডেট সমর্থন করে (অবাস্তব ইঞ্জিন)

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

অবাস্তব ইঞ্জিন SDK ওভারভিউ

প্লে ইন-অ্যাপ আপডেট API হল Play Core SDK পরিবারের অংশ। অবাস্তব ইঞ্জিনের জন্য API আপনার অ্যাপ এবং প্লে API-এর মধ্যে যোগাযোগ পরিচালনা করতে একটি UInAppUpdatesManager ক্লাস অফার করে। একটি অনুরোধ করার পরে, আপনার অ্যাপটি EAppUpdateErrorCode ব্যবহার করে অনুরোধের স্থিতি পরীক্ষা করতে পারে।

অবাস্তব ইঞ্জিন সংস্করণ সমর্থিত

প্লাগইনটি অবাস্তব ইঞ্জিন 5.0 এবং পরবর্তী সমস্ত সংস্করণ সমর্থন করে।

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

সেটআপ

  1. GitHub সংগ্রহস্থল থেকে Play Unreal Engine Plugin ডাউনলোড করুন।

  2. আপনার অবাস্তব ইঞ্জিন প্রকল্পে আপনার Plugins ফোল্ডারের মধ্যে GooglePlay ফোল্ডারটি অনুলিপি করুন।

  3. আপনার অবাস্তব ইঞ্জিন প্রকল্প খুলুন এবং সম্পাদনা → প্লাগইন ক্লিক করুন।

  4. Google Play-এর জন্য অনুসন্ধান করুন এবং সক্রিয় চেকবক্সটি চেক করুন।

  5. গেম প্রজেক্ট রিস্টার্ট করুন এবং একটি বিল্ড ট্রিগার করুন।

  6. আপনার প্রকল্পের Build.cs ফাইল খুলুন এবং PublicDependencyModuleNamesPlayInAppUpdates মডিউল যোগ করুন:

    using UnrealBuildTool;
    
    public class MyGame : ModuleRules
    {
      public MyGame(ReadOnlyTargetRules Target) : base(Target)
      {
        // ...
    
        PublicDependencyModuleNames.Add("PlayInAppUpdates");
    
        // ...
      }
    }
    

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

আপনি একটি আপডেটের অনুরোধ করার আগে, আপনার অ্যাপের জন্য একটি আপডেট উপলব্ধ আছে কিনা তা পরীক্ষা করুন। একটি আপডেট পরীক্ষা করতে UInAppUpdatesManager::RequestInfo ব্যবহার করুন:

MyClass.h

void MyClass::OnRequestInfoOperationCompleted(
  EAppUpdateErrorCode ErrorCode,
  UAppUpdateInfo* UpdateInfo)
{
  // Check the resulting error code.
  if (ErrorCode == EAppUpdateErrorCode::AppUpdate_NO_ERROR)
  {
    // Check AppUpdateInfo's UpdateAvailability, UpdatePriority,
    // IsUpdateTypeAllowed(), ... and decide whether to ask the user
    // to start an in-app update.
  }
}

MyClass.cpp

void MyClass::CheckForUpdateAvailability()
{
  // Create a delegate to bind the callback function.
  FRequestInfoOperationCompletedDelegate Delegate;

  // Bind the completion handler (OnRequestInfoOperationCompleted) to the delegate.
  Delegate.BindDynamic(this, &MyClass::OnRequestInfoOperationCompleted);

  // Initiate the request info operation, passing the delegate to handle the result.
  GetGameInstance()
    ->GetSubsystem<UInAppUpdatesManager>()
    ->RequestInfo(Delegate);
}

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

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

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

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

int32 ClientVersionStalenessDays = UpdateInfo->GetClientVersionStalenessDays();

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

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: update পদ্ধতিতে পাস করা Edit.tracks সম্পদে উল্লেখ করা উচিত। নিম্নলিখিত উদাহরণটি সংস্করণ কোড 88 এবং inAppUpdatePriority 5 সহ একটি অ্যাপ প্রকাশ করে:

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

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

int32 Priority = UpdateInfo->GetPriority();

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

আপনি একটি আপডেট উপলব্ধ আছে তা নিশ্চিত করার পরে, আপনি UInAppUpdatesManager::StartUpdate ব্যবহার করে একটি আপডেটের অনুরোধ করতে পারেন। আপনি একটি আপডেটের অনুরোধ করার আগে, নিশ্চিত করুন যে আপনার কাছে একটি আপ-টু-ডেট UAppUpdateInfo অবজেক্ট আছে। আপডেট ফ্লো কনফিগার করতে আপনাকে অবশ্যই একটি UAppUpdateOptions অবজেক্ট তৈরি করতে হবে।

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

// Creates an UAppUpdateOptions defining an immediate in-app
// update flow and its parameters.
UAppUpdateOptions* Options = NewObject<UAppUpdateOptions>();
Options->CreateOptions(EAppUpdateType::AppUpdate_TYPE_IMMEDIATE);

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

// Creates an UAppUpdateOptions defining a flexible in-app
// update flow and its parameters.
UAppUpdateOptions* Options = NewObject<UAppUpdateOptions>();
Options->CreateOptions(EAppUpdateType::AppUpdate_TYPE_FLEXIBLE);

UAppUpdateOptions অবজেক্টে একটি IsAssetPackDeletionAllowed ফাংশনও রয়েছে যা সীমিত ডিভাইস স্টোরেজের ক্ষেত্রে অ্যাসেট প্যাকগুলি সাফ করার জন্য আপডেটটি অনুমোদিত কিনা তা প্রদান করে। এই ক্ষেত্রটি ডিফল্টরূপে false সেট করা আছে, তবে আপনি UAppUpdateOptions::SetAssetPackDeletionAllowed পরিবর্তে এটিকে true সেট করার অনুমতি দিয়ে ক্ষেত্র সেট করতে পারেন:

// Sets the AssetPackDeletionAllowed field to true.
Options->SetAssetPackDeletionAllowed(true);

পরবর্তী পদক্ষেপগুলি আপনি একটি নমনীয় আপডেট বা একটি তাত্ক্ষণিক আপডেটের অনুরোধ করছেন কিনা তার উপর নির্ভর করে৷

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

আপনার কাছে একটি আপ-টু-ডেট UAppUpdateInfo অবজেক্ট এবং একটি সঠিকভাবে কনফিগার করা UAppUpdateOptions অবজেক্ট থাকার পরে, আপনি একটি আপডেট প্রবাহের অনুরোধ করতে UInAppUpdatesManager::StartUpdate কল করতে পারেন।

MyClass.h

void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
  // ...
}

MyClass.cpp

// .cpp
void MyClass::StartUpdate()
{
  // Create a delegate to bind the callback function.
  FUpdateOperationCompletedDelegate Delegate;

  // Bind the completion handler (OnStartUpdateOperationCompleted) to the delegate.
  Delegate.BindDynamic(this, &MyClass::OnStartUpdateOperationCompleted);

  // Initiate the start update operation, passing the delegate to handle the result.
  GetGameInstance()
    ->GetSubsystem<UInAppUpdatesManager>()
    ->StartUpdate(UpdateInfo, UpdateOptions, Delegate);
}

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

MyClass.h

void MyClass::OnCompleteUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
  // ...
}

MyClass.cpp

void MyClass::CompleteFlexibleUpdate()
{
  // Create a delegate to bind the callback function.
  FUpdateOperationCompletedDelegate Delegate;

  // Bind the completion handler (OnCompleteUpdateOperationCompleted) to the delegate.
  Delegate.BindDynamic(this, &MyClass::OnCompleteUpdateOperationCompleted);

  // Initiate the complete update operation, passing the delegate to handle the result.
  GetGameInstance()
    ->GetSubsystem<UInAppUpdatesManager>()
    ->CompleteUpdate(UpdateInfo, UpdateOptions, Delegate);
}

একটি অবিলম্বে আপডেট হ্যান্ডেল

আপনার কাছে একটি আপ-টু-ডেট UAppUpdateInfo অবজেক্ট এবং একটি সঠিকভাবে কনফিগার করা UAppUpdateOptions অবজেক্ট থাকার পরে, আপনি একটি আপডেট প্রবাহের অনুরোধ করতে InAppUpdatesManager::StartUpdate কল করতে পারেন।

MyClass.h

void MyClass::OnStartUpdateOperationCompleted(EAppUpdateErrorCode ErrorCode)
{
  // ...
}

MyClass.cpp

void MyClass::StartUpdate()
{
  // Create a delegate to bind the callback function.
  FUpdateOperationCompletedDelegate Delegate;

  // Bind the completion handler (OnStartUpdateOperationCompleted) to the delegate.
  Delegate.BindDynamic(this, &MyClass::OnStartUpdateOperationCompleted);

  // Initiate the start update operation, passing the delegate to handle the result.
  GetGameInstance()
    ->GetSubsystem<UInAppUpdatesManager>()
    ->StartUpdate(UpdateInfo, UpdateOptions, Delegate);
}

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

ত্রুটি হ্যান্ডলিং

এই বিভাগটি সাধারণ ত্রুটির সমাধান বর্ণনা করে।

  • যদি UInAppUpdatesManager::StartUpdate একটি AppUpdate_INVALID_REQUEST ত্রুটি প্রদান করে, তাহলে এর মানে হল UAppUpdateInfo অবৈধ৷ নিশ্চিত করুন যে UAppUpdateInfo অবজেক্টটি UInAppUpdatesManager::RequestInfo আপডেট প্রবাহ শুরু করার আগে শূন্য নয়।
  • যদি UInAppUpdatesManager::StartUpdate AppUpdate_NOT_ALLOWED ত্রুটি প্রদান করে, তাহলে এর মানে হল যে UAppUpdateOptions অবজেক্ট একটি আপডেটের ধরন নির্দেশ করে যা উপলব্ধ আপডেটের জন্য অনুমোদিত নয়। আপডেট প্রবাহ শুরু করার আগে UAppUpdateInfo অবজেক্টটি নির্দেশ করে যে নির্বাচিত আপডেট প্রকারটি অনুমোদিত কিনা তা পরীক্ষা করুন।

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

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