Engage SDK ক্লাস্টার প্রকাশ করা সংক্রান্ত নির্দেশিকা

এই গাইডে ক্লাস্টার প্রকাশ করার জন্য নির্দেশাবলীর একটি সেট রয়েছে যা ডেভেলপাররা Engage SDK-এর সাথে ইন্টিগ্রেট করার সময় ব্যবহার করতে পারেন।

সাজেশন ক্লাস্টার

ক্লাস্টারের শীর্ষক

আমরা অনন্য এবং প্রাসঙ্গিক ক্লাস্টার শিরোনাম প্রদান করার পরামর্শ দিই যা ব্যবহারকারীদের ক্লাস্টারের কন্টেন্ট সম্পর্কে আরও ইনসাইট দেয়।

কন্টেন্টের উপর ভিত্তি করে ক্লাস্টারের ভাল নামের কিছু উদাহরণ এখানে দেওয়া হল:

  • শপিং-সম্পর্কিত ক্লাস্টার
    • লাইটনিং ডিল
    • সাপ্তাহিক অবশ্যই কিনতে হবে
    • আপনার Pixel Buds কেনার সাথে সম্পর্কিত
    • মহিলাদের রেন বুট
    • স্বাস্থ্য সম্পর্কিত বইয়ের ক্লাস্টার
    • স্বাস্থ্য, মন ও শরীর
    • স্বাস্থ্য বিভাগে আপনার জন্য সাজেস্ট করা হয়েছে
    • ফিটনেস বিভাগে সবচেয়ে বেশি বিক্রি হওয়া প্রোডাক্ট

ক্লাস্টার কন্টেন্ট

সাজেশন ক্লাস্টার প্রকাশ করার সময়, ডেভেলপারকে অবশ্যই বিবেচনা করতে হবে যে ব্যবহারকারী ডেভেলপারের অ্যাপ্লিকেশনে সাইন-ইন করেছেন কিনা।

ব্যবহারকারী সাইন-ইন করে থাকলে

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

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

নমনীয়

আমরা দিনে একবার সাজেশন আপডেট করার পরামর্শ দিই যাতে ব্যবহারকারীরা প্রতিদিন নতুন সাজেশন দেখতে পান।

সাজেস্ট করা কন্টেন্ট কী হবে সেই সম্পর্কে ব্যবহারকারীর কোনও নির্দিষ্ট প্রত্যাশা থাকে না, তাই কন্টেন্ট ফ্রেশনেস স্ট্র্যাটেজি শিথিল হতে পারে।
ব্যবহারকারীর তৈরি করা কন্টেন্ট লাইব্রেরি

কঠোর

ব্যবহারকারী ডেভেলপার অ্যাপ থেকে বেরিয়ে গেলে, আমরা কন্টেন্ট লাইব্রেরি আপডেট করার সাজেস্ট করি।

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

ব্যবহারকারী সাইন-ইন না করে থাকলে

ব্যবহারকারী ডেভেলপার অ্যাপে সাইন-ইন না করলেও, আমরা ক্লাস্টার প্রকাশ করার সাজেশন দিই যাতে ব্যবহারকারী Google সারফেস থেকে ডেভেলপার অ্যাপে যেতে উৎসাহিত হন।

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

নমনীয়

আমরা সাজেস্ট করি যে দিনে একবার করে সাজেশন আপডেট করুন।

সাজেস্ট করা কন্টেন্ট কী হবে সেই সম্পর্কে ব্যবহারকারীর কোনও নির্দিষ্ট প্রত্যাশা থাকে না, তাই কন্টেন্ট ফ্রেশনেস স্ট্র্যাটেজি শিথিল হতে পারে।
সাজেশনে সাইন-ইন কার্ড

কঠোর

ব্যবহারকারী ডেভেলপার অ্যাপ থেকে বেরিয়ে গেলে, আমরা সাইন-ইন কার্ডের স্ট্যাটাস আপডেট করার সাজেস্ট করি।

ব্যবহারকারী সাইন-ইন করার পরে, ডেভেলপারকে deleteUserManagementCluster() API কল করে কার্ডটি মুছে দিতে হবে।

Google সারফেসের সাথে সাইন-ইন স্ট্যাটাস সিঙ্ক করা গুরুত্বপূর্ণ। ব্যবহারকারী আগে থেকেই সাইন-ইন করে থাকলে, Google-এর সারফেসে সাইন-ইন কার্ড দেখানো হলে তিনি বিভ্রান্ত হতে পারেন। তাই, কন্টেন্ট ফ্রেশনেস স্ট্র্যাটেজি কঠোর হতে হবে।

কন্টিনিউয়েশন ক্লাস্টার

কন্টিনিউয়েশন ক্লাস্টার প্রকাশ করার সময়, ডেভেলপারকে অবশ্যই বিবেচনা করতে হবে যে ব্যবহারকারী ডেভেলপারের অ্যাপ্লিকেশনে সাইন-ইন করেছেন কিনা।

ব্যবহারকারী সাইন-ইন করে থাকলে

  • ব্যবহারকারীর তৈরি করা কন্টিনিউয়েশন ক্লাস্টার প্রকাশ করতে হবে।
    • ব্যবহারকারীর তৈরি করা কন্টিনিউয়েশন ক্লাস্টারের কিছু উদাহরণ এখানে দেওয়া হল:
      • ব্যবহারকারী যেখানে দেখা বন্ধ করেছিলেন সেখান থেকে দেখা চালিয়ে যান।
      • ব্যবহারকারী যেখানে পড়া শেষ করেছিলেন সেখান থেকে পড়া চালিয়ে যান।
কন্টিনিউয়েশনের ধরন কন্টেন্ট ফ্রেশনেস স্ট্র্যাটেজি কন্টেন্ট ফ্রেশনেস সংক্রান্ত নির্দেশিকা
ব্যবহারকারীর তৈরি করা কন্টিনিউয়েশন ক্লাস্টার

কঠোর

ব্যবহারকারী ডেভেলপার অ্যাপ থেকে বেরিয়ে গেলে, আমরা কন্টেন্ট লাইব্রেরি আপডেট করার সাজেস্ট করি।

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

ব্যবহারকারী সাইন-ইন না করে থাকলে

চালিয়ে যাওয়া সংক্রান্ত জার্নি মূলত সাইন-ইন করা ব্যবহারকারীদের জন্য; তবে, আপনার অ্যাপে অতিথি সেশনের সুবিধা থাকলে, আপনি সাইন-আউট করা ব্যবহারকারীদের জন্যও চালিয়ে যাওয়া সংক্রান্ত ক্লাস্টার প্রকাশ করতে পারেন।

ব্যবহারকারী ম্যানেজমেন্ট ক্লাস্টার

ব্যবহারকারী ম্যানেজমেন্ট ক্লাস্টারের মূল উদ্দেশ্য হল ব্যবহারকারীদের প্রদানকারী অ্যাপে নির্দিষ্ট কিছু অ্যাকশন করতে উৎসাহিত করা। সাইন-ইন অ্যাকশন ব্যবহারকারীদের অ্যাপের সাইন-ইন পৃষ্ঠায় নির্দেশ করে যাতে অ্যাপটি কন্টেন্ট প্রকাশ করতে পারে (অথবা আরও পছন্দমতো কন্টেন্ট প্রদান করতে পারে)

সাইন-ইন কার্ড

অ্যাট্রিবিউট প্রয়োজনীয়তা বর্ণনা
অ্যাকশন Uri প্রয়োজনীয় অ্যাকশনের ডিপলিঙ্ক (যেমন, অ্যাপের সাইন-ইন পৃষ্ঠায় নেভিগেট করে)
ছবি ঐচ্ছিক - এটি না দিলে, শীর্ষক দিতেই হবে

কার্ডে দেখানো ছবি

১২৬৪x৭১২ রেজোলিউশন সহ ১৬x৯ অ্যাস্পেক্ট রেশিওর ছবি

শীর্ষক ঐচ্ছিক - এটি না দিলে, ছবি দিতেই হবে কার্ডে লেখা নাম
অ্যাকশন টেক্সট ঐচ্ছিক CTA-তে দেখানো টেক্সট (যেমন, সাইন-ইন করুন)
সাবটাইটেল ঐচ্ছিক কার্ডে ঐচ্ছিক সাবটাইটেল

Kotlin

var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

appEngagePublishClient.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

জাভা

SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

appEngagePublishClient.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

ব্যবহারকারী সাইন-ইন করার পরে, ডেভেলপারকে deleteUserManagementCluster() API কল করে কার্ডটি মুছে দিতে হবে।

প্রকাশনার স্ট্যাটাস আপডেট করুন

যদি কোনও অভ্যন্তরীণ ব্যবসায়িক কারণে, কোনও ক্লাস্টারই প্রকাশ করা না হয়, আমরা দৃঢ়ভাবে সাজেস্ট করি যে updatePublishStatus API ব্যবহার করে প্রকাশের স্ট্যাটাস আপডেট করুন। এটি গুরুত্বপূর্ণ কারণ :

  • কন্টেন্ট প্রকাশিত হলেও (STATUS == PUBLISHED), সব পরিস্থিতিতে স্ট্যাটাস প্রদান করা গুরুত্বপূর্ণ, যাতে ড্যাশবোর্ডগুলি আপনার ইন্টিগ্রেশনের স্বাস্থ্য এবং অন্যান্য মেট্রিক্স জানাতে এই স্পষ্ট স্ট্যাটাস ব্যবহার করতে পারে।
  • কোনও কন্টেন্ট প্রকাশ করা না হলেও ইন্টিগ্রেশন স্ট্যাটাস যদি ঠিক থাকে (STATUS == NOT_PUBLISHED), Google অ্যাপের হেলথ ড্যাশবোর্ডে অ্যালার্ট ট্রিগার করা এড়াতে পারে। এটি নিশ্চিত করে যে প্রদানকারীর দৃষ্টিকোণ থেকে একটি প্রত্যাশিত পরিস্থিতির কারণে কন্টেন্ট প্রকাশ করা হয়নি।
  • ডেটা কখন প্রকাশ করা হয়েছে বনাম কখন করা হয়নি সেই সম্পর্কে ইনসাইট প্রদান করতে এটি ডেভেলপারদের সাহায্য করে।
  • Google স্ট্যাটাস কোড ব্যবহার করে ব্যবহারকারীকে অ্যাপে নির্দিষ্ট কিছু অ্যাকশন করার জন্য অনুরোধ করতে পারে যাতে তারা অ্যাপের কন্টেন্ট দেখতে বা সমস্যাটি সমাধান করতে পারে।

প্রকাশের স্ট্যাটাস কোডের তালিকা হল :

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

ব্যবহারকারী লগ-ইন না করার কারণে কন্টেন্ট প্রকাশ করা না হলে, আমরা সাইন-ইন কার্ড প্রকাশ করার সাজেশন দেব। কোনও কারণে পরিষেবা প্রদানকারী সাইন-ইন কার্ড প্রকাশ করতে না পারলে, আমরা স্ট্যাটাস কোড NOT_PUBLISHED_REQUIRES_SIGN_IN সহ updatePublishStatus API কল করার সাজেশন দিই

Kotlin

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

জাভা

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

ক্লাস্টার প্রকাশ করার জন্য WorkManager

আমরা ক্লাস্টার প্রকাশ করার জন্য WorkManager ব্যবহার করার সাজেশন দিই, কারণ এটি ব্যাকগ্রাউন্ডে কাজ করার জন্য সাজেস্ট করা সমাধান যেখানে এক্সিকিউশন সুবিধাজনক এবং গ্যারান্টিযুক্ত হতে হবে।

  • WorkManager যত তাড়াতাড়ি সম্ভব আপনার ব্যাকগ্রাউন্ডের কাজ করে।
  • ব্যবহারকারী আপনার অ্যাপ থেকে বেরিয়ে গেলেও, WorkManager বিভিন্ন পরিস্থিতিতে আপনার কাজ শুরু করার লজিক ম্যানেজ করে।

ব্যবহারকারী অ্যাপ থেকে বেরিয়ে গেলে, আমরা ব্যাকগ্রাউন্ডে এমন একটি কাজ শুরু করার সাজেশন দিই যা সাজেশন ক্লাস্টারের সাথে কন্টিনিউয়েশন ক্লাস্টার প্রকাশ করে। এই লজিক ম্যানেজ করার জন্য Activity.onStop() হল একটি ভালো জায়গা, ব্যবহারকারী অ্যাপ থেকে বেরিয়ে গেলে এটি কল করা হয়।

আমরা সাজেস্ট করি যে আপনি PeriodicWorkRequest ব্যবহার করে এমন একটি রেকারিং জব শিডিউল করুন যা প্রতি ২৪ ঘণ্টা অন্তর ক্লাস্টার প্রকাশ করে। কাজ ট্রিগার করার জন্য CANCEL_AND_REENQUEUE নীতি ব্যবহার করে, ডেভেলপাররা নিশ্চিত করতে পারেন যে ব্যবহারকারী অ্যাপ থেকে দূরে সরে যাওয়ার সময় WorkManager প্রতিবার আপডেট করা ডেটা পাঠায়। এটি ব্যবহারকারীদের পুরানো ডেটা দেখা থেকে বিরত রাখতে সাহায্য করে।

নিম্নলিখিত উদাহরণে এটি দেখানো হয়েছে:

// Define the PublishClusters Worker requiring input
public class PublishClusters extends Worker {

   public PublishClusters(Context appContext, WorkerParameters workerParams) {
       super(appContext, workerParams);
   }

   @NonNull
   @Override
   public Result doWork() {
       // publish clusters
   }
   ...
}

public static void schedulePublishClusters(Context appContext) {
// Create a PeriodicWorkRequest to schedule a recurring job to update
// clusters at a regular interval
PeriodicWorkRequest publishClustersEntertainmentSpace =
// Define the time for the periodic job
       new PeriodicWorkRequest.Builder(PublishClusters.class, 24, TimeUnit.HOURS)
// Set up a tag for the worker.
// Tags are Unique identifier, which can be used to identify that work
// later in order to cancel the work or observe its progress.
          .addTag("Publish Clusters to Entertainment Space")
          .build();

// Trigger Periodic Job, this will ensure that the periodic job is triggered
// only once since we have defined a uniqueWorkName
WorkManager.getInstance(appContext).enqueueUniquePeriodicWork(
// uniqueWorkName
     "publishClustersEntertainmentSpace",
// If a work with the uniqueWorkName is already running, it will cancel the
// existing running jobs and replace it with the new instance.
// ExistingPeriodicWorkPolicy#CANCEL_AND_REENQUEUE
     ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
// Recurring Work Request
publishClustersEntertainmentSpace);

}

ব্রডকাস্ট ইনটেন্ট ম্যানেজ করা

জবের মাধ্যমে কন্টেন্ট প্রকাশ করার API কল করার পাশাপাশি, কন্টেন্ট প্রকাশের অনুরোধ পাওয়ার জন্য BroadcastReceiver সেট-আপ করতে হবে।

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

BroadcastReceiver অবশ্যই নিম্নলিখিত দুটি উপায়ে সেট-আপ করতে হবে:

  • Context.registerReceiver() ব্যবহার করে BroadcastReceiver ক্লাসের ইনস্ট্যান্স ডায়নামিক্যালি রেজিস্টার করুন। এটি মেমরিতে এখনও লাইভ আছে এমন অ্যাপ্লিকেশন থেকে কমিউনিকেশন চালু করে।
  • আপনার AndroidManifest.xml ফাইলে <receiver> ট্যাগ সহ স্ট্যাটিক্যালি একটি ইমপ্লিমেন্টেশন ঘোষণা করুন। এটি অ্যাপ্লিকেশনটিকে ব্রডকাস্ট ইনটেন্ট গ্রহণ করার অনুমতি দেয় যখন এটি চলছে না এবং অ্যাপ্লিকেশনটিকে কন্টেন্ট প্রকাশ করারও অনুমতি দেয়।