पब्लिश करने की तारीख: 2 दिसंबर, 2020
भरोसेमंद वेब गतिविधि की सुविधा लॉन्च होने के बाद से, Chrome की टीम ने Bubblewrap के साथ इसका इस्तेमाल करना आसान बना दिया है. हमने इसमें Google Play Billing इंटिग्रेशन जैसी अतिरिक्त सुविधाएं जोड़ी हैं. साथ ही, इसे ChromeOS जैसे अन्य प्लैटफ़ॉर्म पर काम करने के लिए चालू किया है.
Bubblewrap और भरोसेमंद वेब गतिविधि की सुविधाएं
Bubblewrap की मदद से, ऐसे ऐप्लिकेशन बनाए जा सकते हैं जो भरोसेमंद वेब गतिविधि में आपके पीडब्ल्यूए लॉन्च करते हैं. इसके लिए, आपको प्लैटफ़ॉर्म के हिसाब से टूल की जानकारी होना ज़रूरी नहीं है.
सेटअप फ़्लो को आसान बनाना
पहले, Bubblewrap का इस्तेमाल करने के लिए, Java डेवलपमेंट किट और Android SDK टूल को मैन्युअल तरीके से सेट अप करना पड़ता था. इन दोनों में गड़बड़ियां होने की संभावना होती है. अब यह टूल, पहली बार इस्तेमाल किए जाने पर बाहरी डिपेंडेंसी को अपने-आप डाउनलोड करने का विकल्प देता है.
अगर आपको डिपेंडेंसी के मौजूदा इंस्टॉलेशन का इस्तेमाल करना है, तो अब भी ऐसा किया जा सकता है. साथ ही, नया doctor कमांड, कॉन्फ़िगरेशन में मौजूद समस्याओं का पता लगाने और उन्हें ठीक करने के सुझाव देने में मदद करता है. कॉन्फ़िगरेशन को अब updateConfig कमांड का इस्तेमाल करके, कमांड लाइन से अपडेट किया जा सकता है.
बेहतर विज़र्ड
init का इस्तेमाल करके कोई प्रोजेक्ट बनाते समय, Bubblewrap को Android ऐप्लिकेशन जनरेट करने के लिए जानकारी की ज़रूरत होती है. यह टूल, वेब ऐप्लिकेशन मेनिफ़ेस्ट से वैल्यू निकालता है और जहां भी संभव हो डिफ़ॉल्ट वैल्यू उपलब्ध कराता है.
नया प्रोजेक्ट बनाते समय, उन वैल्यू को बदला जा सकता है. हालांकि, पहले हर फ़ील्ड का मतलब साफ़ तौर पर नहीं बताया गया था. शुरुआती डायलॉग बॉक्स को फिर से बनाया गया. इनमें हर इनपुट फ़ील्ड के लिए बेहतर जानकारी और पुष्टि करने की सुविधा जोड़ी गई.
फ़ुलस्क्रीन और ओरिएंटेशन की सुविधा
कुछ मामलों में, हो सकता है कि आपको अपने ऐप्लिकेशन के लिए, स्क्रीन के ज़्यादा से ज़्यादा हिस्से का इस्तेमाल करना हो. पीडब्ल्यूए बनाते समय, वेब ऐप्लिकेशन मेनिफ़ेस्ट से display फ़ील्ड को fullscreen पर सेट करके ऐसा किया जाता है.
जब Bubblewrap को वेब ऐप्लिकेशन मेनिफ़ेस्ट में फ़ुलस्क्रीन का विकल्प मिलता है, तो यह Android ऐप्लिकेशन को फ़ुल स्क्रीन में लॉन्च करने के लिए कॉन्फ़िगर करता है. इसके अलावा, Android की खास शर्तों के मुताबिक, इमर्सिव मोड में भी लॉन्च करने के लिए कॉन्फ़िगर करता है.
वेब ऐप्लिकेशन मेनिफ़ेस्ट का orientation फ़ील्ड यह तय करता है कि ऐप्लिकेशन को पोर्ट्रेट मोड, लैंडस्केप मोड या डिवाइस के मौजूदा ओरिएंटेशन में शुरू किया जाना चाहिए या नहीं. Bubblewrap अब वेब ऐप्लिकेशन मेनिफ़ेस्ट फ़ील्ड को पढ़ता है और Android ऐप्लिकेशन बनाते समय, इसे डिफ़ॉल्ट के तौर पर इस्तेमाल करता है.
bubblewrap init फ़्लो के तहत, दोनों कॉन्फ़िगरेशन को अपनी पसंद के मुताबिक बनाया जा सकता है.
AppBundles आउटपुट
ऐप्लिकेशन बंडल, ऐप्लिकेशन पब्लिश करने का एक फ़ॉर्मैट है. यह फ़ॉर्मैट, फ़ाइनल APK जनरेट करने और उस पर हस्ताक्षर करने की ज़िम्मेदारी Google Play को सौंपता है. इससे, स्टोर से ऐप्लिकेशन डाउनलोड करते समय, उपयोगकर्ताओं को छोटे साइज़ की फ़ाइलें उपलब्ध कराई जा सकती हैं.
Bubblewrap अब ऐप्लिकेशन को ऐप्लिकेशन बंडल के तौर पर पैकेज करता है. यह app-release-bundle.aab नाम की फ़ाइल में होता है. Play Store पर ऐप्लिकेशन पब्लिश करते समय, आपको इस फ़ॉर्मैट को प्राथमिकता देनी चाहिए. ऐसा इसलिए, क्योंकि साल 2021 से Play Store पर ऐप्लिकेशन पब्लिश करने के लिए, इस फ़ॉर्मैट का इस्तेमाल करना ज़रूरी है.
जियोलोकेशन डेलिगेशन
उपयोगकर्ता चाहते हैं कि उनके डिवाइसों पर इंस्टॉल किए गए ऐप्लिकेशन, टेक्नोलॉजी के बावजूद एक जैसा काम करें. भरोसेमंद वेब गतिविधि में इस्तेमाल किए जाने पर, GeoLocation की अनुमति अब ऑपरेटिंग सिस्टम को दी जा सकती है. साथ ही, इसे चालू करने पर, उपयोगकर्ताओं को Kotlin या Java से बनाए गए ऐप्लिकेशन की तरह ही डायलॉग दिखते हैं. इसके अलावा, उन्हें अनुमति को मैनेज करने के लिए कंट्रोल भी उसी जगह पर मिलते हैं.
इस सुविधा को Bubblewrap की मदद से जोड़ा जा सकता है. इससे Android प्रोजेक्ट में अतिरिक्त डिपेंडेंसी जुड़ जाती हैं. इसलिए, आपको इसे सिर्फ़ तब चालू करना चाहिए, जब वेब ऐप्लिकेशन, जगह की जानकारी की अनुमति का इस्तेमाल कर रहा हो.
ऑप्टिमाइज़ की गई बाइनरी
दुनिया के कुछ इलाकों में, कम स्टोरेज वाले डिवाइसों का इस्तेमाल आम है. ऐसे डिवाइसों के मालिक अक्सर छोटे ऐप्लिकेशन पसंद करते हैं. भरोसेमंद वेब गतिविधि का इस्तेमाल करने वाले ऐप्लिकेशन, छोटी बाइनरी बनाते हैं. इससे उपयोगकर्ताओं को कुछ हद तक राहत मिलती है.
Bubblewrap को ऑप्टिमाइज़ किया गया है. इसके लिए, ज़रूरी Android लाइब्रेरी की सूची को छोटा किया गया है. इससे जनरेट की गई बाइनरी का साइज़ 800 केबी कम हो गया है. असल में, यह पिछले वर्शन से जनरेट किए गए औसत साइज़ के आधे से भी कम है. छोटे बाइनरी का फ़ायदा पाने के लिए, आपको Bubblewrap के नए वर्शन का इस्तेमाल करके, अपने ऐप्लिकेशन को अपडेट करना होगा.
किसी मौजूदा ऐप्लिकेशन को अपडेट करने का तरीका
Bubblewrap से जनरेट किया गया ऐप्लिकेशन, एक वेब ऐप्लिकेशन और एक लाइटवेट Android रैपर से मिलकर बनता है. यह रैपर, पीडब्ल्यूए को खोलता है. भरोसेमंद वेब गतिविधि में खोला गया पीडब्ल्यूए, किसी भी वेब ऐप्लिकेशन की तरह ही अपडेट साइकल का पालन करता है. हालांकि, नेटिव रैपर को अपडेट किया जा सकता है और किया जाना चाहिए.
आपको अपना ऐप्लिकेशन अपडेट करना चाहिए, ताकि यह पक्का किया जा सके कि वह रैपर के नए वर्शन का इस्तेमाल कर रहा है. साथ ही, उसमें गड़बड़ियां ठीक करने की नई सुविधाएं और अन्य सुविधाएं मौजूद हैं. Bubblewrap का नया वर्शन इंस्टॉल होने पर, update कमांड किसी मौजूदा प्रोजेक्ट पर रैपर का नया वर्शन लागू करता है:
npm update -g @bubblewrap/cli
bubblewrap update
bubblewrap build
उन ऐप्लिकेशन को अपडेट करने की एक और वजह यह है कि वेब मेनिफ़ेस्ट में किए गए बदलाव, ऐप्लिकेशन पर लागू हो जाएं. इसके लिए, नए merge निर्देश का इस्तेमाल करें:
bubblewrap merge
bubblewrap update
bubblewrap build
क्वालिटी से जुड़ी ज़रूरी शर्तों में किए गए अपडेट
Chrome 86 में, भरोसेमंद वेब गतिविधि की क्वालिटी की ज़रूरी शर्तों में बदलाव किए गए हैं. इनके बारे में पूरी जानकारी, भरोसेमंद वेब गतिविधि का इस्तेमाल करने वाले पीडब्ल्यूए के लिए, क्वालिटी की ज़रूरी शर्तों में किए गए बदलाव में दी गई है.
संक्षेप में कहें, तो आपको यह पक्का करना चाहिए कि आपके ऐप्लिकेशन इन स्थितियों को हैंडल करें, ताकि वे क्रैश न हों:
- ऐप्लिकेशन लॉन्च करते समय, डिजिटल ऐसेट लिंक की पुष्टि न हो पाना
- ऑफ़लाइन नेटवर्क रिसॉर्स के अनुरोध के लिए, एचटीटीपी 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, सर्विस वर्कर का इस्तेमाल करते समय सबसे सही तरीकों को शामिल करता है और बॉयलरप्लेट को हटाता है. इसके अलावा, इन स्थितियों को मैनेज करने के लिए, 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,
});
}
}