ওয়েব ইন প্লে এর জন্য নতুন কি

যেহেতু বিশ্বস্ত ওয়েব অ্যাক্টিভিটি গত বছর চালু করা হয়েছিল, Chrome টিম পণ্যটির উপর কাজ চালিয়ে যাচ্ছে, এটিকে বাবল র‍্যাপের সাথে ব্যবহার করা সহজ করে, আসন্ন Google Play বিলিং ইন্টিগ্রেশনের মতো নতুন বৈশিষ্ট্য যোগ করে এবং ChromeOS এর মতো আরও প্ল্যাটফর্মে কাজ করতে সক্ষম করে৷ এই নিবন্ধটি বিশ্বস্ত ওয়েব কার্যকলাপের জন্য সর্বশেষ এবং আসন্ন আপডেটগুলিকে সংক্ষিপ্ত করবে৷

নতুন Bubblewrap এবং বিশ্বস্ত ওয়েব কার্যকলাপ বৈশিষ্ট্য

Bubblewrap আপনাকে এমন অ্যাপ তৈরি করতে সাহায্য করে যেগুলি প্ল্যাটফর্ম-নির্দিষ্ট টুলিংয়ের জ্ঞানের প্রয়োজন ছাড়াই একটি বিশ্বস্ত ওয়েব অ্যাক্টিভিটির মধ্যে আপনার PWA চালু করে।

সরলীকৃত সেটআপ প্রবাহ

পূর্বে, Bubblewrap ব্যবহার করার জন্য জাভা ডেভেলপমেন্ট কিট এবং Android SDK ম্যানুয়ালি সেট আপ করতে হবে, উভয়ই ত্রুটি প্রবণ। টুলটি এখন প্রথমবার চালানোর সময় বাহ্যিক নির্ভরতা স্বয়ংক্রিয়ভাবে ডাউনলোড করার প্রস্তাব দেয়।

আপনি এখনও নির্ভরতাগুলির একটি বিদ্যমান ইনস্টলেশন ব্যবহার করতে বেছে নিতে পারেন, যদি আপনি এটি করতে পছন্দ করেন, এবং নতুন doctor কমান্ড সমস্যাগুলি খুঁজে পেতে সহায়তা করে এবং কনফিগারেশনের সমাধানের সুপারিশ করে, যা এখন updateConfig কমান্ড ব্যবহার করে কমান্ড লাইন থেকে আপডেট করা যেতে পারে।

উন্নত উইজার্ড

init দিয়ে একটি প্রজেক্ট তৈরি করার সময়, Android অ্যাপ তৈরি করতে Bubblewrap-এর তথ্য প্রয়োজন। টুলটি ওয়েব অ্যাপ ম্যানিফেস্ট থেকে মান বের করে এবং যেখানে সম্ভব ডিফল্ট প্রদান করে।

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

প্রদর্শন: পূর্ণস্ক্রীন এবং অভিযোজন সমর্থন

কিছু ক্ষেত্রে, আপনি আপনার অ্যাপ্লিকেশনটিকে যতটা সম্ভব স্ক্রীন ব্যবহার করতে চাইতে পারেন এবং PWAs তৈরি করার সময়, ওয়েব অ্যাপ ম্যানিফেস্ট থেকে fullscreen display ক্ষেত্র সেট করে এটি প্রয়োগ করা হয়।

যখন Bubblewrap ওয়েব অ্যাপ ম্যানিফেস্টে পূর্ণস্ক্রীন বিকল্পটি সনাক্ত করে, তখন এটি Android অ্যাপ্লিকেশনটিকে সম্পূর্ণ স্ক্রীনে, বা নিমজ্জিত মোডে , Android নির্দিষ্ট শর্তে চালু করার জন্য কনফিগার করবে৷

ওয়েব অ্যাপ ম্যানিফেস্টের orientation ক্ষেত্রটি সংজ্ঞায়িত করে যে অ্যাপ্লিকেশনটি পোর্ট্রেট মোড, ল্যান্ডস্কেপ মোডে বা ডিভাইসটি বর্তমানে ব্যবহার করা অভিযোজনে শুরু করা উচিত কিনা৷ Bubblewrap এখন ওয়েব অ্যাপ ম্যানিফেস্ট ক্ষেত্র পড়ে এবং Android অ্যাপ তৈরি করার সময় এটিকে ডিফল্ট হিসেবে ব্যবহার করে।

আপনি উভয় কনফিগারেশন কাস্টমাইজ করতে পারেন bubblewrap init প্রবাহের অংশ হিসাবে কাস্টমাইজ করা যেতে পারে।

AppBundles আউটপুট

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

Bubblewrap এখন app-release-bundle.aab নামে একটি ফাইলে অ্যাপ্লিকেশনটিকে একটি অ্যাপ বান্ডেল হিসাবে প্যাকেজ করে। প্লে স্টোরে অ্যাপগুলি প্রকাশ করার সময় আপনার এই ফর্ম্যাটটি পছন্দ করা উচিত কারণ এটি 2021 সালের দ্বিতীয়ার্ধ থেকে শুরু করে স্টোরের প্রয়োজন হবে।

ভূ-অবস্থান প্রতিনিধি দল

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

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

অপ্টিমাইজ করা বাইনারি

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

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

কিভাবে একটি বিদ্যমান অ্যাপ আপডেট করবেন

Bubblewrap দ্বারা উত্পন্ন একটি অ্যাপ্লিকেশন একটি ওয়েব অ্যাপ্লিকেশন এবং একটি হালকা ওজনের অ্যান্ড্রয়েড র‍্যাপার দ্বারা গঠিত যা PWA খোলে৷ যদিও PWA একটি বিশ্বস্ত ওয়েব অ্যাক্টিভিটির ভিতরে খোলা যেকোন ওয়েব অ্যাপের মতো একই আপডেট চক্র অনুসরণ করে, নেটিভ র‍্যাপার আপডেট হতে পারে এবং করা উচিত।

আপনার অ্যাপ আপডেট করা উচিত যাতে এটি লেটেস্ট বাগ ফিক্স এবং বৈশিষ্ট্য সহ র্যাপারের সর্বশেষ সংস্করণ ব্যবহার করছে। Bubblewrap এর সর্বশেষ সংস্করণ ইনস্টল করার সাথে, update কমান্ডটি একটি বিদ্যমান প্রকল্পে মোড়কের সর্বশেষ সংস্করণ প্রয়োগ করবে:

npm update -g @bubblewrap/cli
bubblewrap update
bubblewrap build

সেই অ্যাপ্লিকেশনগুলিকে আপডেট করার আরেকটি কারণ হল ওয়েব ম্যানিফেস্টের পরিবর্তনগুলি অ্যাপ্লিকেশনটিতে প্রয়োগ করা হয়েছে তা নিশ্চিত করা৷ এর জন্য নতুন merge কমান্ড ব্যবহার করুন:

bubblewrap merge
bubblewrap update
bubblewrap build

গুণমানের মানদণ্ডের আপডেট

ক্রোম 86 বিশ্বস্ত ওয়েব অ্যাক্টিভিটি কোয়ালিটি ক্রাইটেরিয়াতে পরিবর্তন এনেছে, যা বিশ্বস্ত ওয়েব অ্যাক্টিভিটি ব্যবহার করে PWA-এর জন্য মানের মানদণ্ডের পরিবর্তনে সম্পূর্ণ ব্যাখ্যা করা হয়েছে।

একটি দ্রুত সারাংশ হল যে আপনার অ্যাপ্লিকেশনগুলিকে ক্র্যাশ হওয়া থেকে রক্ষা করার জন্য নিম্নলিখিত পরিস্থিতিগুলি পরিচালনা করে তা নিশ্চিত করা উচিত:

  • অ্যাপ্লিকেশন লঞ্চের সময় ডিজিটাল সম্পদ লিঙ্ক যাচাই করতে ব্যর্থ
  • একটি অফলাইন নেটওয়ার্ক সংস্থান অনুরোধের জন্য HTTP 200 ফেরত দিতে ব্যর্থ৷
  • অ্যাপ্লিকেশনটিতে HTTP 404 বা 5xx ত্রুটির রিটার্ন।

অ্যাপ্লিকেশনটি ডিজিটাল সম্পদ লিঙ্কের বৈধতা পাস করেছে তা নিশ্চিত করার পাশাপাশি, অবশিষ্ট পরিস্থিতিগুলি একজন পরিষেবা কর্মী দ্বারা পরিচালনা করা যেতে পারে:

self.addEventListener('fetch', event => {
  event.respondWith((async () => {
    try {
      return await fetchAndHandleError(event.request);
    } catch {
      // Failed to load from the network. User is offline or the response
      // has a status code that triggers the Quality Criteria.
      // Try loading from cache.
      const cachedResponse = await caches.match(event.request);
      if (cachedResponse) {
        return cachedResponse;
      }
      // Response was not found on the cache. Send the error / offline
      // page. OFFLINE_PAGE should be pre-cached when the service worker
      // is activated.
      return await caches.match(OFFLINE_PAGE);
    }
  })());
});

async function fetchAndHandleError(request) {
  const cache = await caches.open(RUNTIME_CACHE);
  const response = await fetch(request);

  // Throw an error if the response returns one of the status
  // that trigger the Quality Criteria.
  if (response.status === 404 ||
      response.status >= 500 && response.status < 600) {
    throw new Error(`Server responded with status: ${response.status}`);
  }

  // Cache the response if the request is successful.
  cache.put(request, response.clone());
  return response;
}

ওয়ার্কবক্স সর্বোত্তম অনুশীলনে বেক করে এবং পরিষেবা কর্মীদের ব্যবহার করার সময় বয়লারপ্লেট সরিয়ে দেয়। বিকল্পভাবে, সেই পরিস্থিতিগুলি পরিচালনা করতে একটি ওয়ার্কবক্স প্লাগইন ব্যবহার করার কথা বিবেচনা করুন:

export class FallbackOnErrorPlugin {
  constructor(offlineFallbackUrl, notFoundFallbackUrl, serverErrorFallbackUrl) {
    this.notFoundFallbackUrl = notFoundFallbackUrl;
    this.offlineFallbackUrl = offlineFallbackUrl;
    this.serverErrorFallbackUrl = serverErrorFallbackUrl;
  }

  checkTrustedWebActivityCrash(response) {
    if (response.status === 404 || response.status >= 500 && response.status <= 600) {
      const type = response.status === 404 ? 'E_NOT_FOUND' : 'E_SERVER_ERROR';
      const error = new Error(`Invalid response status (${response.status})`);
      error.type = type;
      throw error;
    }
  }

  // This is called whenever there's a network response,
  // but we want special behavior for 404 and 5**.
  fetchDidSucceed({response}) {
    // Cause a crash if this is a Trusted Web Activity crash.
    this.checkTrustedWebActivityCrash(response);

    // If it's a good response, it can be used as-is.
    return response;
  }

  // This callback is new in Workbox v6, and is triggered whenever
  // an error (including a NetworkError) is thrown when a handler runs.
  handlerDidError(details) {
    let fallbackURL;
    switch (details.error.details.error.type) {
      case 'E_NOT_FOUND': fallbackURL = this.notFoundFallbackUrl; break;
      case 'E_SERVER_ERROR': fallbackURL = this.serverErrorFallbackUrl; break;
      default: fallbackURL = this.offlineFallbackUrl;
    }

    return caches.match(fallbackURL, {
      // Use ignoreSearch as a shortcut to work with precached URLs
      // that have _WB_REVISION parameters.
      ignoreSearch: true,
    });
  }
}

গুগল প্লে বিলিং

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

Chrome 88 Android-এ একটি অরিজিন ট্রায়ালের সাথে লঞ্চ করবে যা Google Play বিলিং-এর মাধ্যমে ক্রয় প্রবাহ বাস্তবায়নের জন্য বিশ্বস্ত ওয়েব অ্যাক্টিভিটি , পেমেন্ট রিকোয়েস্ট API এবং ডিজিটাল গুডস API- এর একীকরণ সক্ষম করে। আমরা আশা করি এই অরিজিন ট্রায়ালটি 89 সংস্করণে ChromeOS-এর জন্যও উপলব্ধ হবে।

গুরুত্বপূর্ণ: Google Play বিলিং API এর নিজস্ব পরিভাষা রয়েছে এবং এতে ক্লায়েন্ট এবং ব্যাকএন্ড উপাদান অন্তর্ভুক্ত রয়েছে। এই বিভাগটি API এর শুধুমাত্র একটি ছোট অংশ কভার করে যা ডিজিটাল গুডস API এবং বিশ্বস্ত ওয়েব কার্যকলাপ ব্যবহার করার জন্য নির্দিষ্ট। প্রোডাকশন অ্যাপ্লিকেশানে একীভূত করার আগে Google Play বিলিং ডকুমেন্টেশন পড়তে এবং এর ধারণাগুলি বুঝতে ভুলবেন না৷

মৌলিক প্রবাহ

প্লে কনসোল মেনু

প্লে স্টোরের মাধ্যমে ডিজিটাল পণ্য সরবরাহ করতে আপনাকে প্লে স্টোরে আপনার ক্যাটালগ কনফিগার করতে হবে, সেইসাথে আপনার PWA থেকে একটি অর্থপ্রদানের পদ্ধতি হিসাবে প্লে স্টোরকে সংযুক্ত করতে হবে।

আপনি যখন আপনার ক্যাটালগ কনফিগার করতে প্রস্তুত হন, তখন প্লে কনসোলের বাম দিকের মেনুতে পণ্য বিভাগটি খুঁজে শুরু করুন:

এখানে আপনি আপনার বিদ্যমান অ্যাপ-মধ্যস্থ পণ্য এবং সদস্যতা দেখার বিকল্প পাবেন এবং আপনি নতুন যুক্ত করার জন্য তৈরি বোতামটিও পাবেন।

অ্যাপ-মধ্যস্থ পণ্য

পণ্যের বিবরণ

একটি নতুন অ্যাপ-মধ্যস্থ পণ্য তৈরি করতে আপনার একটি পণ্য আইডি, নাম, বিবরণ এবং একটি মূল্যের প্রয়োজন হবে৷ অর্থপূর্ণ এবং সহজে মনে রাখা পণ্য আইডি তৈরি করা গুরুত্বপূর্ণ, আপনার সেগুলি পরে প্রয়োজন হবে এবং একবার তৈরি হয়ে গেলে আইডিগুলি পরিবর্তন করা যাবে না৷

সদস্যতা তৈরি করার সময় আপনাকে একটি বিলিং সময়কালও উল্লেখ করতে হবে। আপনার সাবস্ক্রিপশন সুবিধাগুলি তালিকাভুক্ত করার এবং আপনার বিনামূল্যে ট্রায়াল, একটি প্রাথমিক মূল্য, একটি গ্রেস পিরিয়ড, এবং একটি পুনঃসাবস্ক্রাইব বিকল্পের মত বৈশিষ্ট্যগুলি যোগ করার বিকল্প রয়েছে৷

প্রতিটি পণ্য তৈরি করার পরে, সেগুলি সক্রিয় করে আপনার অ্যাপ থেকে উপলব্ধ করুন৷

আপনি যদি চান তাহলে আপনি Play Developers API এর মাধ্যমে আপনার পণ্য যোগ করতে পারেন।

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

ডিজিটাল গুডস এপিআই দিয়ে পণ্যের মূল্য আনুন

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

// The SKU for the product, as defined in the Play Store interface
async function populatePrice(sku) {
  try {
    // Check if the Digital Goods API is supported by the browser.
    if (window.getDigitalGoodsService) {
      // The Digital Goods API can be supported by other Payments provider.
      // In this case, we're retrieving the Google Play Billing provider.
      const service =
          await window.getDigitalGoodsService("https://play.google.com/billing");

      // Fetch product details using the `getDetails()` method.
      const details = await service.getDetails([sku]);

      if (details.length === 0) {
        console.log(`Could not get SKU: "${sku}".`);
        return false;
      }

      // The details will contain both the price and the currenncy.
      item = details[0];
      const value = item.price.value;
      const currency = item.price.currency;

      const formattedPrice = new Intl.NumberFormat(navigator.language, {
        style: 'currency', currency: currency }).format(value);

      // Display the price to the user.
      document.getElementById("price").innerHTML = formattedPrice;
    } else {
      console.error("Could not get price for SKU \"" + sku + "\".");
    }
  } catch (error) {
    console.log(error);
  }
  return false;
}

getDigitalGoodsService() window অবজেক্টে উপলব্ধ কিনা তা পরীক্ষা করে আপনি ডিজিটাল গুডস API-এর জন্য সমর্থন সনাক্ত করতে পারেন।

তারপর একটি প্যারামিটার হিসাবে Google Play বিলিং শনাক্তকারীর সাথে window.getDigitalGoodsService() কল করুন। এটি Google Play বিলিং-এর জন্য একটি পরিষেবার দৃষ্টান্ত প্রদান করবে এবং অন্যান্য বিক্রেতারা ডিজিটাল গুডস API-এর জন্য সমর্থন বাস্তবায়ন করতে পারে এবং তাদের আলাদা আলাদা শনাক্তকারী থাকবে।

অবশেষে, একটি প্যারামিটার হিসাবে আইটেমের জন্য SKU পাস করার Google Play বিলিং অবজেক্টের রেফারেন্সে getDetails() কল করুন। পদ্ধতিটি ব্যবহারকারীর কাছে প্রদর্শিত হতে পারে এমন আইটেমের মূল্য এবং মুদ্রা উভয়ই সমন্বিত একটি বিশদ বস্তু ফেরত দেবে।

ক্রয় প্রবাহ শুরু করুন

পেমেন্ট রিকোয়েস্ট API ওয়েবে ক্রয় প্রবাহকে সক্ষম করে এবং এটি Google Play বিলিং ইন্টিগ্রেশনের জন্যও ব্যবহৃত হয়। আপনি যদি পেমেন্ট রিকোয়েস্ট এপিআই-এ নতুন হন তাহলে আরও জানতে কীভাবে পেমেন্ট রিকোয়েস্ট এপিআই কাজ করে তা দেখুন।

Google Play বিলিং-এর সাথে API ব্যবহার করার জন্য আপনাকে https://play.google.com/billing নামে একটি সমর্থিত মেটোড আছে এমন একটি অর্থপ্রদানের উপকরণ যোগ করতে হবে এবং যন্ত্রের ডেটার অংশ হিসেবে SKU যোগ করতে হবে:

const supportedInstruments = [{
  supportedMethods: "https://play.google.com/billing",
  data: {
    sku: sku
  }
}];

তারপরে, যথারীতি একটি PaymentRequest অবজেক্ট তৈরি করুন এবং যথারীতি API ব্যবহার করুন

const request = new PaymentRequest(supportedInstruments, details);

ক্রয় স্বীকার করুন

একবার লেনদেন সম্পূর্ণ হলে, আপনাকে অর্থপ্রদান স্বীকার করতে ডিজিটাল গুডস API ব্যবহার করতে হবে। PaymentRequest এর প্রতিক্রিয়া বস্তুতে একটি টোকেন থাকবে যা আপনি লেনদেন স্বীকার করতে ব্যবহার করবেন:

const response = await request.show();
const token = response.details.token;
const service =
          await window.getDigitalGoodsService("https://play.google.com/billing");
await service.acknowledge(token, 'onetime');

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

বিদ্যমান এনটাইটেলমেন্ট চেক করুন

একজন ব্যবহারকারী একটি প্রচার কোড রিডিম করেছেন বা আপনার পণ্যের একটি বিদ্যমান সদস্যতা থাকতে পারে৷ ব্যবহারকারীর উপযুক্ত এনটাইটেলমেন্ট আছে কিনা তা যাচাই করার জন্য, আপনি ডিজিটাল পণ্য পরিষেবাতে listPurchases() কমান্ডে কল করতে পারেন। এটি আপনার গ্রাহক আপনার অ্যাপে করা সমস্ত কেনাকাটা ফেরত দেবে। ব্যবহারকারী সঠিকভাবে তাদের এনটাইটেলমেন্টগুলি খালাস করেছে তা নিশ্চিত করতে এটি কোনও অস্বীকৃত কেনাকাটা স্বীকার করার জায়গাও হবে।

const purchases = await itemService.listPurchases();
for (p of purchases) {
  if (!p.acknowledged) {
    await itemService.acknowledge(p.purchaseToken, 'onetime');
  }
}

ChromeOS প্লে স্টোরে আপলোড করুন

ChromeOS প্লে স্টোরে Chrome 85 থেকে বিশ্বস্ত ওয়েব কার্যকলাপগুলিও উপলব্ধ। স্টোরে আপনার অ্যাপকে তালিকাভুক্ত করার প্রক্রিয়াটি ChromeOS-এর জন্য একই রকম, যেমনটি Android-এর জন্য।

একবার আপনি আপনার অ্যাপ বান্ডেল তৈরি করে নিলে, Play Console আপনাকে Play Store-এ অ্যাপ তালিকাভুক্ত করার প্রয়োজনীয় পদক্ষেপের মাধ্যমে গাইড করবে। Play Console ডকুমেন্টেশনে আপনি আপনার অ্যাপ তালিকা তৈরি করতে , আপনার apk ফাইলগুলি এবং অন্যান্য সেটিংস পরিচালনা করতে, সেইসাথে আপনার অ্যাপটি পরীক্ষা এবং নিরাপদে প্রকাশ করার নির্দেশাবলী পেতে সহায়তা পেতে পারেন৷

আপনার অ্যাপ্লিকেশানটিকে শুধুমাত্র Chromebooks-এ সীমাবদ্ধ করতে, Bubblewrap-এ অ্যাপ্লিকেশান আরম্ভ করার সময় --chromeosonly পতাকা যোগ করুন:

bubblewrap init --manifest="https://example.com/manifest.json" --chromeosonly

আপনার অ্যাপ্লিকেশনটি ম্যানুয়ালি তৈরি করার সময়, বাবল র‍্যাপ ছাড়াই, আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে একটি uses-feature পতাকা যোগ করুন:

<uses-feature  android:name="org.chromium.arc" android:required="true"/>

যদি আপনার তালিকাটি একটি Android অ্যাপের সাথে শেয়ার করা হয়, তাহলে ChromeOS শুধুমাত্র প্যাকেজ সংস্করণটি সবসময় Android অ্যাপের প্যাকেজ সংস্করণের চেয়ে বেশি হতে হবে। আপনি ChromeOS বান্ডেল সংস্করণটিকে Android সংস্করণের চেয়ে অনেক বেশি সংখ্যায় সেট আপ করতে পারেন, তাই আপনাকে প্রতিটি প্রকাশের সাথে উভয় সংস্করণ আপডেট করতে হবে না।