Web In Play में नया क्या है

पिछले साल भरोसेमंद वेब गतिविधि लॉन्च होने के बाद से, Chrome टीम इस प्रॉडक्ट पर लगातार काम कर रही है. इससे, Bubblewrap के साथ इस्तेमाल करना आसान हो गया है. साथ ही, Google Play Billing के आने वाले इंटिग्रेशन जैसी नई सुविधाएं जोड़ी गई हैं और प्रॉडक्ट को ChromeOS जैसे अन्य प्लैटफ़ॉर्म पर भी इस्तेमाल किया जा सकता है. इस लेख में, भरोसेमंद वेब गतिविधि से जुड़े नए और आने वाले अपडेट के बारे में बताया जाएगा.

बबल रैप और भरोसेमंद वेब गतिविधि की नई सुविधाएं

Bubblewrap, ऐसे ऐप्लिकेशन बनाने में आपकी मदद करता है जो भरोसेमंद वेब गतिविधि में आपके PWA को लॉन्च करते हैं. इसके लिए, प्लैटफ़ॉर्म के हिसाब से बने टूल की जानकारी होना ज़रूरी नहीं है.

आसान सेटअप फ़्लो

इससे पहले, Bubblewrap को इस्तेमाल करने के लिए, Java डेवलपमेंट किट और Android SDK को मैन्युअल तरीके से सेट अप करना पड़ता था. इन दोनों में ही गड़बड़ी होने की आशंका होती है. यह टूल पहली बार चलाने पर, अब बाहरी डिपेंडेंसी को अपने-आप डाउनलोड करने की सुविधा देता है.

अगर आप ऐसा करना चाहते हैं, तो आपके पास अब भी डिपेंडेंसी के मौजूदा इंस्टॉलेशन को इस्तेमाल करने का विकल्प है. साथ ही, नया doctor कमांड, समस्याओं का पता लगाने और उन्हें ठीक करने का सुझाव देता है. कॉन्फ़िगरेशन को ठीक करने के लिए, updateConfig कमांड का इस्तेमाल किया जा सकता है.

बेहतर बनाया गया विज़र्ड

init पर कोई प्रोजेक्ट बनाते समय, Bubblewrap को Android ऐप्लिकेशन जनरेट करने के लिए जानकारी की ज़रूरत होती है. यह टूल, वेब ऐप्लिकेशन मेनिफ़ेस्ट से वैल्यू निकालता है और जहां भी संभव हो, डिफ़ॉल्ट सेटिंग उपलब्ध कराता है.

नया प्रोजेक्ट बनाते समय उन वैल्यू को बदला जा सकता है. हालांकि, पहले हर फ़ील्ड का मतलब साफ़ तौर पर नहीं बताया जाता था. हर इनपुट फ़ील्ड के लिए, शुरू करने वाले डायलॉग बॉक्स को बेहतर जानकारी और पुष्टि के साथ फिर से बनाया गया था.

डिसप्ले: फ़ुलस्क्रीन और ओरिएंटेशन की सुविधा

कुछ मामलों में, हो सकता है कि आप अपने ऐप्लिकेशन को स्क्रीन का ज़्यादा से ज़्यादा इस्तेमाल करने की अनुमति दें. साथ ही, PWA बनाते समय, display फ़ील्ड को वेब ऐप्लिकेशन मेनिफ़ेस्ट से fullscreen पर सेट करके इसे लागू किया जा सकता है.

जब बबल रैप, वेब ऐप्लिकेशन मेनिफ़ेस्ट में फ़ुलस्क्रीन विकल्प का पता लगा लेता है, तब वह Android ऐप्लिकेशन को Android से जुड़ी शर्तों के हिसाब से फ़ुल स्क्रीन या इमर्सिव मोड में भी लॉन्च करने के लिए कॉन्फ़िगर करता है.

वेब ऐप्लिकेशन मेनिफ़ेस्ट के orientation फ़ील्ड से पता चलता है कि ऐप्लिकेशन को पोर्ट्रेट मोड में शुरू किया जाना चाहिए, लैंडस्केप मोड में या डिवाइस के ओरिएंटेशन में इस्तेमाल किया जाना चाहिए. Bubblewrap अब वेब ऐप्लिकेशन मेनिफ़ेस्ट फ़ील्ड को पढ़ता है और Android ऐप्लिकेशन बनाते समय डिफ़ॉल्ट के तौर पर इसका इस्तेमाल करता है.

bubblewrap init फ़्लो के तहत, दोनों कॉन्फ़िगरेशन को अपनी पसंद के मुताबिक बनाया जा सकता है.

Appbundles का आउटपुट

ऐप्लिकेशन बंडल, उन ऐप्लिकेशन के लिए पब्लिश करने का फ़ॉर्मैट है जो आखिरी APK जनरेशन और Play पर साइन इन करते हैं. ऐसा करने पर, स्टोर से ऐप्लिकेशन डाउनलोड करते समय उपयोगकर्ताओं को छोटी फ़ाइलें उपलब्ध कराई जा सकती हैं.

Bubblewrap अब ऐप्लिकेशन को, ऐप्लिकेशन बंडल के तौर पर, app-release-bundle.aab नाम की फ़ाइल में पैकेज करता है. Play Store पर ऐप्लिकेशन पब्लिश करते समय आपको इस फ़ॉर्मैट का इस्तेमाल करना चाहिए, क्योंकि 2021 की दूसरी छमाही से स्टोर के लिए यह ज़रूरी होगा.

जगह से जुड़ी जानकारी का ऐक्सेस दें

उपयोगकर्ता चाहते हैं कि उनके डिवाइस पर इंस्टॉल किए गए ऐप्लिकेशन लगातार काम करें, चाहे उसकी टेक्नोलॉजी कुछ भी हो. किसी भरोसेमंद वेब गतिविधि में इस्तेमाल किए जाने पर, अब GeoLocation अनुमति ऑपरेटिंग सिस्टम को दी जा सकती है. चालू होने पर, उपयोगकर्ताओं को वे डायलॉग दिखेंगे जो Kotlin या Java के साथ बनाए गए ऐप्लिकेशन के हैं. साथ ही, उन्हें उसी जगह पर अनुमति को मैनेज करने के कंट्रोल भी दिखेंगे.

इस सुविधा को Bubblewrap से जोड़ा जा सकता है. इसकी वजह यह है कि यह Android प्रोजेक्ट के लिए ज़्यादा डिपेंडेंसी है. इसलिए, आपको इसे सिर्फ़ तब चालू करना चाहिए, जब वेब ऐप्लिकेशन जियोलोकेशन की अनुमति का इस्तेमाल कर रहा हो.

ऑप्टिमाइज़ की गई बाइनरी

आम तौर पर, सीमित स्टोरेज वाले डिवाइस का इस्तेमाल दुनिया के कुछ इलाकों में किया जाता है. ऐसे डिवाइसों के मालिक, अक्सर छोटे ऐप्लिकेशन इस्तेमाल करना पसंद करते हैं. भरोसेमंद वेब गतिविधि का इस्तेमाल करने वाले ऐप्लिकेशन छोटी-छोटी बाइनरी बनाते हैं, जिससे उपयोगकर्ताओं की चिंता दूर हो जाती है.

ज़रूरी Android लाइब्रेरी की सूची को कम करके, Bubblewrap को ऑप्टिमाइज़ किया गया है. इससे, जनरेट की गई बाइनरी बन गई हैं जो 8 लाख छोटी हैं. यह पिछले वर्शन से जनरेट हुए औसत साइज़ के आधे से भी कम है. छोटी बाइनरी का फ़ायदा पाने के लिए, आपको सिर्फ़ बबल रैप के सबसे नए वर्शन का इस्तेमाल करके अपना ऐप्लिकेशन अपडेट करना होगा.

मौजूदा ऐप्लिकेशन को अपडेट करने का तरीका

Bubblewrap से जनरेट किया गया ऐप्लिकेशन, एक वेब ऐप्लिकेशन और एक लाइटवेट Android रैपर से बना होता है, जिससे PWA खुलता है. भले ही PWA किसी भरोसेमंद वेब गतिविधि में खुला रहता है और किसी भी वेब ऐप्लिकेशन की तरह ही इसे अपडेट करता है, लेकिन नेटिव रैपर को अपडेट किया जा सकता है और किया जाना चाहिए.

आपको अपना ऐप्लिकेशन अपडेट करना चाहिए, ताकि यह पक्का किया जा सके कि वह रैपर के सबसे नए वर्शन का इस्तेमाल कर रहा हो. साथ ही, उसमें नई गड़बड़ियां ठीक करने और सुविधाएं मौजूद हों. Bubblewrap का सबसे नया वर्शन इंस्टॉल करने के बाद, update कमांड रैपर का नया वर्शन किसी मौजूदा प्रोजेक्ट पर लागू करेगा:

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

इन ऐप्लिकेशन को अपडेट करने की एक वजह यह भी है कि वेब मेनिफ़ेस्ट में किए गए बदलाव ऐप्लिकेशन पर लागू हों. इसके लिए, नए merge कमांड का इस्तेमाल करें:

bubblewrap merge
bubblewrap update
bubblewrap build

क्वालिटी के लिए ज़रूरी शर्तों में किए गए अपडेट

Chrome 86 ने भरोसेमंद वेब गतिविधि की क्वालिटी से जुड़ी शर्तों में बदलाव किए हैं. इनके बारे में पूरी जानकारी भरोसेमंद वेब गतिविधि का इस्तेमाल करके PWA के क्वालिटी से जुड़े बदलावों वाले लेख में दी गई है.

खास जानकारी यह है कि आपको यह पक्का करना चाहिए कि आपके ऐप्लिकेशन इन स्थितियों में काम करें, ताकि ऐप्लिकेशन क्रैश होने से रोका जा सके:

  • ऐप्लिकेशन लॉन्च करते समय डिजिटल एसेट लिंक की पुष्टि न कर पाना
  • ऑफ़लाइन नेटवर्क संसाधन अनुरोध के लिए HTTP 200 लौटाने में गड़बड़ी
  • ऐप्लिकेशन में एचटीटीपी 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;
}

वर्कबॉक्स सबसे सही तरीकों को बनाता है और सर्विस वर्कर का इस्तेमाल करते समय बॉयलरप्लेट हटा देता है. इसके अलावा, इन स्थितियों को हैंडल करने के लिए Workbox प्लगिन का इस्तेमाल किया जा सकता है:

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 Billing

Play Store पर आपके ऐप्लिकेशन को डिजिटल प्रॉडक्ट और सदस्यताएं बेचने की अनुमति देने के अलावा, Google Play Billing में आपको कई टूल मिलते हैं. इनकी मदद से, अपने कैटलॉग, कीमतों, और सदस्यताओं को मैनेज किया जा सकता है. साथ ही, इससे काम की रिपोर्ट और Play Store पर उपलब्ध ऐसे चेकआउट प्रोसेस को भी मैनेज किया जा सकता है जिनके बारे में आपके उपयोगकर्ता पहले से जानते हैं. डिजिटल प्रॉडक्ट बेचने वाले Play Store पर पब्लिश किए गए ऐप्लिकेशन के लिए भी यह शर्त ज़रूरी है.

Chrome 88 को Android पर ऑरिजिन ट्रायल के साथ लॉन्च किया जाएगा. इससे Google Play Billing के ज़रिए परचेज़ फ़्लो लागू करने के लिए, भरोसेमंद वेब गतिविधियों, पेमेंट का अनुरोध करने वाला एपीआई, और डिजिटल प्रॉडक्ट एपीआई का इंटिग्रेशन चालू होगा. हमें उम्मीद है कि ChromeOS के वर्शन 89 पर यह ऑरिजिन ट्रायल भी उपलब्ध होगा.

अहम जानकारी: Google Play Billing API की अपनी शब्दावली है. इसमें क्लाइंट और बैकएंड कॉम्पोनेंट शामिल होते हैं. इस सेक्शन में एपीआई के सिर्फ़ एक छोटे से हिस्से के बारे में बताया गया है जो खास तौर पर डिजिटल वस्तुओं के एपीआई और भरोसेमंद वेब गतिविधि का इस्तेमाल करने के लिए है. किसी प्रोडक्शन ऐप्लिकेशन में इंटिग्रेट करने से पहले, Google Play Billing के दस्तावेज़ ज़रूर पढ़ें और इसके कॉन्सेप्ट को समझें.

बुनियादी फ़्लो

Play Console का मेन्यू

Play Store के ज़रिए डिजिटल प्रॉडक्ट उपलब्ध कराने के लिए, आपको Play Store पर अपना कैटलॉग कॉन्फ़िगर करना होगा. साथ ही, Play Store को अपने PWA को पैसे चुकाने के तरीके के रूप में कनेक्ट करना होगा.

जब आप अपना कैटलॉग कॉन्फ़िगर करने के लिए तैयार हों, तो Play Console पर बाईं ओर दिए गए मेन्यू में 'प्रॉडक्ट' सेक्शन पर जाएं. इसके बाद:

यहां आपको ऐप्लिकेशन में खरीदने के लिए मौजूदा प्रॉडक्ट और सदस्यताएं देखने का विकल्प मिलेगा. साथ ही, आपको नए प्रॉडक्ट जोड़ने के लिए'बनाएं' बटन भी मिलेगा.

ऐप्लिकेशन के अंदर प्रॉडक्ट

उत्‍पाद विवरण

ऐप्लिकेशन में खरीदा जा सकने वाला नया प्रॉडक्ट बनाने के लिए, आपको प्रॉडक्ट आईडी, नाम, ब्यौरा, और कीमत की ज़रूरत होगी. काम के और याद रखने में आसान प्रॉडक्ट आईडी बनाना ज़रूरी है. आपको बाद में उनकी ज़रूरत होगी और आईडी बनाने के बाद उन्हें बदला नहीं जा सकता.

सदस्यताएं बनाते समय आपको बिलिंग अवधि भी तय करनी होगी. आपके पास सदस्यता के फ़ायदों की सूची बनाने और सुविधाओं को जोड़ने का विकल्प होता है. जैसे, सदस्यता को मुफ़्त में आज़माना, सदस्यता की शुरुआती कीमत, ग्रेस पीरियड, और फिर से सदस्यता लेने का विकल्प.

हर प्रॉडक्ट बनाने के बाद, उसे अपने ऐप्लिकेशन में उपलब्ध कराने के लिए, उसे चालू करें.

Play Developers API का इस्तेमाल करके, अपने प्रॉडक्ट जोड़े जा सकते हैं.

कैटलॉग कॉन्फ़िगर होने के बाद, PWA से चेकआउट फ़्लो को कॉन्फ़िगर करना है. इसके लिए, आपको डिजिटल प्रॉडक्ट के एपीआई और पेमेंट का अनुरोध करने वाला एपीआई, दोनों का इस्तेमाल करना होगा.

डिजिटल गुड्स एपीआई की मदद से, प्रॉडक्ट की कीमत की जानकारी फ़ेच करें

Google Play Billing का इस्तेमाल करते समय, आपको यह पक्का करना होगा कि उपयोगकर्ताओं को दिखाई गई कीमत और स्टोर पेज पर दी गई कीमत एक जैसी हो. इन कीमतों को मैन्युअल तरीके से सिंक रखना नामुमकिन होगा. इसलिए, डिजिटल गुड्स एपीआई वेब ऐप्लिकेशन को एक ऐसा तरीका उपलब्ध कराता है जिससे वह पैसे चुकाने की सेवा देने वाली मूल कंपनी से कीमतों के बारे में क्वेरी कर सके:

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

डिजिटल प्रॉडक्ट एपीआई के साथ काम करने की सुविधा का पता लगाने के लिए, देखें कि window ऑब्जेक्ट पर getDigitalGoodsService() उपलब्ध है या नहीं.

इसके बाद, Google Play Billing आइडेंटिफ़ायर के साथ window.getDigitalGoodsService() को पैरामीटर के तौर पर कॉल करें. इससे Google Play Billing के लिए एक सर्विस इंस्टेंस दिखेगा और दूसरे वेंडर, डिजिटल वस्तुओं के एपीआई के साथ काम कर सकते हैं और उनके पास अलग-अलग आइडेंटिफ़ायर होंगे.

आखिर में, Google Play Billing ऑब्जेक्ट के रेफ़रंस पर getDetails() को कॉल करें, जो आइटम के लिए SKU को पैरामीटर के तौर पर पास कर रहा हो. यह तरीका एक जानकारी ऑब्जेक्ट दिखाएगा, जिसमें कीमत और उस आइटम की मुद्रा, दोनों होगी जिसे उपयोगकर्ता को दिखाया जा सकता है.

परचेज़ फ़्लो शुरू करना

पेमेंट अनुरोध एपीआई, वेब पर परचेज़ फ़्लो चालू करता है. साथ ही, इसका इस्तेमाल Google Play पर बिलिंग इंटिग्रेशन के लिए भी किया जाता है. अगर आपने पेमेंट अनुरोध एपीआई का इस्तेमाल पहले नहीं किया है, तो ज़्यादा जानने के लिए, पेमेंट अनुरोध एपीआई के काम करने का तरीका देखें.

Google Play Billing के साथ एपीआई का इस्तेमाल करने के लिए, आपको पेमेंट का कोई तरीका जोड़ना होगा. पैसे चुकाने का ऐसा तरीका होना चाहिए जो https://play.google.com/billing नाम का हो. साथ ही, SKU को इंस्ट्रुमेंट के डेटा के हिस्से के तौर पर जोड़ें:

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

इसके बाद, हमेशा की तरह PaymentRequest ऑब्जेक्ट बनाएं और एपीआई का हमेशा की तरह इस्तेमाल करें

const request = new PaymentRequest(supportedInstruments, details);

खरीदारी की पुष्टि करें

लेन-देन पूरा होने के बाद, पेमेंट स्वीकार करने के लिए आपको डिजिटल प्रॉडक्ट एपीआई का इस्तेमाल करना होगा. 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');

डिजिटल गुड्स एपीआई और पेमेंट अनुरोध एपीआई के पास उपयोगकर्ता की पहचान के बारे में कोई जानकारी नहीं है. इस वजह से, यह आपकी ज़िम्मेदारी है कि आप खरीदारी को बैकएंड में उपयोगकर्ता से जोड़ें. साथ ही, यह पक्का करें कि उनके पास खरीदे गए आइटम का ऐक्सेस हो. किसी उपयोगकर्ता के साथ खरीदारी को जोड़ते समय, खरीदारी टोकन सेव करना न भूलें. ऐसा इसलिए, क्योंकि आपको यह पुष्टि करने के लिए इसकी ज़रूरत पड़ सकती है कि क्या खरीदारी रद्द कर दी गई है या रिफ़ंड कर दिया गया है या सदस्यता अब भी चालू है. डेवलपर से जुड़ी रीयल-टाइम सूचनाओं का एपीआई और Google Play Developer API देखें, क्योंकि ये आपके बैकएंड में ऐसे मामलों को मैनेज करने के लिए एंडपॉइंट उपलब्ध कराते हैं.

मौजूदा एनटाइटलमेंट की जांच करना

ऐसा हो सकता है कि उपयोगकर्ता ने प्रमोशन कोड रिडीम किया हो या उसके पास आपके प्रॉडक्ट की सदस्यता मौजूद हो. यह पुष्टि करने के लिए कि उपयोगकर्ता के पास सही एनटाइटलमेंट हैं, डिजिटल प्रॉडक्ट सेवा पर listPurchases() कमांड को कॉल किया जा सकता है. इससे उन सभी खरीदारी के बारे में पता चलेगा जो आपके ग्राहक ने आपके ऐप्लिकेशन में की हैं. इस तरह, ऐसी खरीदारी को भी स्वीकार किया जाता है जिसे स्वीकार नहीं किया गया हो. इससे, यह पक्का किया जा सकता है कि ग्राहक अपने एनटाइटलमेंट को सही तरीके से रिडीम करता है.

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

ChromeOS Play Store पर अपलोड करें

ChromeOS Play Store में, Chrome 85 के बाद से ही भरोसेमंद वेब गतिविधियां भी उपलब्ध हैं. ChromeOS की तरह ही Android के लिए, अपने ऐप्लिकेशन को स्टोर में लिस्ट करने की प्रक्रिया एक जैसी होती है.

अपना ऐप्लिकेशन बंडल बना लेने के बाद, Play Console आपको ऐप्लिकेशन को Play Store पर सूची में शामिल करने के ज़रूरी चरणों के बारे में बताएगा. आपको Play Console के दस्तावेज़ में, ऐप्लिकेशन लिस्टिंग बनाने, अपनी apk फ़ाइलों और अन्य सेटिंग को मैनेज करने के बारे में मदद मिल सकती है. साथ ही, यहां आपको जांच करने और अपने ऐप्लिकेशन को सुरक्षित तरीके से रिलीज़ करने से जुड़े निर्देश भी मिल सकते हैं.

अपने ऐप्लिकेशन को सिर्फ़ Chromebook पर सीमित करने के लिए, Bubblewrap में ऐप्लिकेशन शुरू करते समय --chromeosonly फ़्लैग जोड़ें:

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

Bubblewrap के बिना, अपना ऐप्लिकेशन मैन्युअल तरीके से बनाते समय, अपने Android मेनिफ़ेस्ट में uses-feature फ़्लैग जोड़ें:

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

अगर आपकी लिस्टिंग किसी Android ऐप्लिकेशन के साथ शेयर की गई है, तो सिर्फ़ ChromeOS वाला पैकेज वर्शन हमेशा Android ऐप्लिकेशन के पैकेज वर्शन के बाद वाला होना चाहिए. ChromeOS बंडल के वर्शन को Android वर्शन से ज़्यादा संख्या में सेट अप किया जा सकता है. इससे आपको हर रिलीज़ में दोनों वर्शन अपडेट करने की ज़रूरत नहीं पड़ेगी.