Jetpack Webkit की मदद से, वेबव्यू को आसानी से लागू करना

इस गाइड में, Jetpack Webkit लाइब्रेरी के फ़ायदों के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि यह लाइब्रेरी कैसे काम करती है और इसे अपने प्रोजेक्ट में कैसे लागू किया जा सकता है.

खास जानकारी

वेबव्यू, Android डेवलपमेंट का एक ज़रूरी हिस्सा हैं. हालांकि, अलग-अलग Android OS वर्शन में सुविधाओं के अलग-अलग होने की वजह से, कभी-कभी इन्हें मैनेज करना मुश्किल हो सकता है. Android OS के हर वर्शन में, WebView API का एक तय सेट उपलब्ध होता है. Android, WebView की तुलना में कम फ़्रीक्वेंसी पर अपडेट होता है. इसलिए, हो सकता है कि Android API में WebView की सभी उपलब्ध सुविधाएं शामिल न हों. इससे, सुविधा को रोल आउट करने में ज़्यादा समय लगता है और टेस्टिंग की लागत बढ़ जाती है.

Jetpack Webkit, इन समस्याओं को हल करता है. यह एक कंपैटिबिलिटी लेयर के तौर पर काम करता है. साथ ही, उपयोगकर्ता के डिवाइस पर मौजूद WebView APK के अप-टू-डेट वर्शन का इस्तेमाल करता है. इसमें नए और आधुनिक एपीआई भी शामिल हैं, जो सिर्फ़ इस लाइब्रेरी में उपलब्ध हैं.

Jetpack Webkit का इस्तेमाल क्यों करें?

Jetpack Webkit, अलग-अलग वर्शन के साथ काम करने की सुविधा के साथ-साथ नए और आधुनिक एपीआई भी उपलब्ध कराता है. इनकी मदद से, डेवलपमेंट को आसान बनाया जा सकता है और आपके ऐप्लिकेशन की परफ़ॉर्मेंस को बेहतर बनाया जा सकता है:

  • आधुनिक पुष्टि करने की सुविधा चालू करता है: WebView, WebAuthn जैसे आधुनिक वेब पुष्टि करने के स्टैंडर्ड को आसानी से मैनेज कर सकता है. इससे पासकी के आधार पर साइन-इन करने की सुविधा मिलती है. androidx.webkit लाइब्रेरी की मदद से, इस इंटिग्रेशन को पूरी तरह से कंट्रोल किया जा सकता है. इसके लिए, WebSettingsCompat.setWebAuthenticationSupport() तरीके का इस्तेमाल करें. इसकी मदद से, यह कॉन्फ़िगर किया जा सकता है कि आपके ऐप्लिकेशन को किस लेवल के सपोर्ट की ज़रूरत है.

  • परफ़ॉर्मेंस बेहतर होती है: prefetchUrlAsync, prerenderUrlAsync, और setBackForwardCacheEnabled जैसे एपीआई का इस्तेमाल करके, अपने ऐप्लिकेशन के इस्तेमाल के उदाहरणों के लिए WebView की परफ़ॉर्मेंस को बेहतर बनाएं.

  • स्थिरता बढ़ती है: इससे रेंडरर प्रोसेस के रुकने या जवाब न देने की समस्या को ठीक किया जा सकता है. ऐसा बिना क्रैश किए किया जा सकता है. ज़्यादा जानकारी के लिए, WebViewRenderProcess#terminate() देखें.

  • ब्राउज़िंग डेटा पर ज़्यादा कंट्रोल मिलता है: WebView में सेव किए गए ब्राउज़िंग डेटा को मिटाने के लिए, WebStorageCompat क्लास का इस्तेमाल करें.

कॉम्पोनेंट के बारे में जानकारी

Jetpack Webkit का बेहतर तरीके से इस्तेमाल करने के लिए, आपको इन कॉम्पोनेंट के बीच का संबंध समझना होगा:

  • Android System WebView: यह Chromium पर आधारित रेंडरिंग इंजन है. Google इसे नियमित तौर पर अपडेट करता है. यह अपडेट, Google Play Store के ज़रिए Chrome के अपडेट की तरह ही उपलब्ध कराया जाता है. इसमें सबसे नई सुविधाएं शामिल हैं. साथ ही, यह सभी WebView API के लिए, बुनियादी तौर पर लागू होने वाला कोड उपलब्ध कराता है.

  • फ़्रेमवर्क एपीआई (android.webkit): ये ऐसे एपीआई होते हैं जो किसी खास Android OS वर्शन के लिए तय किए जाते हैं. उदाहरण के लिए, Android 10 पर मौजूद कोई ऐप्लिकेशन सिर्फ़ उन एपीआई को ऐक्सेस कर सकता है जो उस वर्शन के रिलीज़ होने के समय उपलब्ध थे. इसलिए, यह WebView APK में हाल ही में जोड़े गए नए फ़ीचर का इस्तेमाल नहीं कर सकता. उदाहरण के लिए, WebView#getWebViewRenderProcess() की मदद से, रेंडरर के जवाब न देने की समस्या को ठीक करने के लिए, इस फ़ंक्शन को सिर्फ़ Android 10 और उसके बाद के वर्शन पर कॉल किया जा सकता है.

  • Jetpack Webkit Library (androidx.webkit): यह एक छोटी लाइब्रेरी है, जो आपके ऐप्लिकेशन में बंडल की गई है. यह लाइब्रेरी, एक ब्रिज की तरह काम करती है. यह Android प्लैटफ़ॉर्म में तय किए गए एपीआई को कॉल करने के बजाय, WebView APK को कॉल करती है. Android प्लैटफ़ॉर्म का ओएस वर्शन तय होता है. इस तरह, अगर कोई ऐप्लिकेशन Android 10 जैसे पुराने ओएस वर्शन वाले डिवाइस पर इंस्टॉल किया जाता है, तो भी वह WebView की नई सुविधाओं का इस्तेमाल कर सकता है. उदाहरण के लिए, WebViewCompat.getWebViewRenderProcess(), Framework API की तरह ही काम करता है. हालांकि, इसे Android 10 से पहले के सभी ओएस वर्शन पर भी कॉल किया जा सकता है.

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

Jetpack Webkit और APK के बीच इंटरैक्शन

Jetpack Webkit में मौजूद एपीआई को दो हिस्सों में लागू किया जाता है:

  • स्टैटिक Jetpack Webkit: स्टैटिक Jetpack Webkit लाइब्रेरी में, एपीआई को लागू करने के लिए ज़िम्मेदार कोड का एक छोटा हिस्सा होता है.

  • WebView APK: WebView APK में ज़्यादातर कोड होता है.

आपका ऐप्लिकेशन, Jetpack Webkit API को कॉल करता है. इसके बाद, यह WebView APK को कॉल करता है.

आपके पास अपने ऐप्लिकेशन में Jetpack Webkit के वर्शन को कंट्रोल करने का विकल्प होता है. हालांकि, आपके पास लोगों के डिवाइसों पर WebView APK के अपडेट को कंट्रोल करने का विकल्प नहीं होता. आम तौर पर, ज़्यादातर उपयोगकर्ताओं के पास WebView APK के अप-टू-डेट वर्शन होते हैं. हालांकि, आपके ऐप्लिकेशन को अब भी यह ध्यान रखना होगा कि वह ऐसे एपीआई को कॉल न करे जिन्हें WebView APK का वह वर्शन सपोर्ट नहीं करता.

Jetpack Webkit, WebView के वर्शन को मैन्युअल तरीके से जांचने की ज़रूरत को भी कम करता है. यह पता लगाने के लिए कि कोई सुविधा उपलब्ध है या नहीं, उसके सुविधा कॉन्स्टेंट की जांच करें. उदाहरण के लिए, WebViewFeature.WEB_AUTHENTICATION.

ये दोनों एक साथ कैसे काम करते हैं

Jetpack Webkit, स्टैटिक फ़्रेमवर्क एपीआई और बार-बार अपडेट होने वाले WebView APK के बीच के अंतर को कम करता है. सुविधा का पता लगाने के पैटर्न के साथ Jetpack Webkit API का इस्तेमाल करने पर, लाइब्रेरी यह जांच करती है कि उपयोगकर्ता के डिवाइस पर इंस्टॉल किया गया WebView APK, सुविधा के साथ काम करता है या नहीं. इससे Android OS (फ़्रेमवर्क) के वर्शन की जांच करने की ज़रूरत नहीं पड़ती.

अगर WebView APK का वर्शन नया है, तो लाइब्रेरी इस सुविधा को चालू कर देती है. अगर ऐसा नहीं होता है, तो यह सूचना मिलती है कि सुविधा उपलब्ध नहीं है. इससे आपका ऐप्लिकेशन क्रैश नहीं होता और आपको स्थिति को आसानी से मैनेज करने में मदद मिलती है.

Jetpack Webkit और फ़्रेमवर्क एपीआई की तुलना करना

इस सेक्शन में, Jetpack Webkit लाइब्रेरी के साथ और उसके बिना लागू करने के तरीकों की तुलना की गई है:

आधुनिक पुष्टि करने की सुविधा (WebAuthn) चालू करना

Jetpack Webkit के बिना

फ़्रेमवर्क एपीआई के ज़रिए ऐसा नहीं किया जा सकता.

Jetpack Webkit की मदद से

यह WebViewFeature.WEB_AUTHENTICATION का इस्तेमाल करके, यह जांच करता है कि यह सुविधा आपके डिवाइस पर काम करती है या नहीं.

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
  WebSettingsCompat.setWebAuthenticationSupport(
      webView.settings,
      WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
  )
}

किसी ऑरिजिन (साइट के हिसाब से स्टोरेज) का डेटा मिटाना

Jetpack WebKit के बिना

किसी ऑरिजिन का डेटा मिटाने के लिए, कोई डायरेक्ट एपीआई उपलब्ध नहीं है. इसके लिए, अक्सर पूरा डेटा मिटाना पड़ता है.

Jetpack WebKit के साथ

यह सटीक डेटा मिटाने के लिए, कंपैटिबिलिटी एपीआई का इस्तेमाल करता है. इनमें से किसी एक विकल्प का इस्तेमाल किया जा सकता है:

WebStorageCompat.getInstance().deleteBrowsingData()

या

WebStorageCompat.getInstance().deleteBrowsingDataForSite()

WebView का वर्शन पाना

Jetpack WebKit के बिना

यह स्टैंडर्ड फ़्रेमवर्क क्लास का इस्तेमाल करता है.

val webViewPackage = WebView.getCurrentWebViewPackage()

Jetpack WebKit के साथ

यह सुरक्षित तरीके से डेटा वापस पाने के लिए, कंपैटिबिलिटी लेयर का इस्तेमाल करता है.

val webViewPackage = WebViewCompat.getCurrentWebViewPackage()

रेंडरर (रेंडरर क्लाइंट) के जवाब न देने की समस्या को ठीक करना

Jetpack WebKit के बिना

यह स्टैंडर्ड फ़्रेमवर्क के तरीके का इस्तेमाल करता है.

webView.setWebViewRenderProcessClient(myClient)

Jetpack WebKit के साथ

यह क्लाइंट सेट करने के लिए, WebViewCompat और सुविधा की जांच का इस्तेमाल करता है.

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
  WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}

ज़्यादा जानकारी के लिए, androidx.webkit रेफ़रंस दस्तावेज़ देखें.

अपने कोड में Jetpack Webkit को इंटिग्रेट करना

Jetpack Webkit का इस्तेमाल करने से, स्टैंडर्ड WebView क्लास की क्षमताओं में बढ़ोतरी होती है. हालांकि, यह ओरिजनल WebView क्लास को पूरी तरह से नहीं बदलता.

android.webkit.WebView क्लास का इस्तेमाल जारी रखा जा सकता है. इसे अपने एक्सएमएल लेआउट में जोड़ा जा सकता है. साथ ही, अपने कोड में इंस्टेंस का रेफ़रंस पाया जा सकता है. स्टैंडर्ड फ़्रेमवर्क की सुविधाओं को ऐक्सेस करने के लिए, अब भी सीधे तौर पर WebView इंस्टेंस या उसकी सेटिंग ऑब्जेक्ट पर कॉल किया जा सकता है.

नई सुविधाओं को ऐक्सेस करने के लिए, Jetpack Webkit की ओर से उपलब्ध कराई गई स्टैटिक हेल्पर मेथड का इस्तेमाल किया जाता है. जैसे, WebViewCompat और WebSettingsCompat. इन तरीकों में, अपने मौजूदा WebView इंस्टेंस को पास करें.

Kotlin

import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature

// You still get your WebView instance the standard way.
val webView: WebView = findViewById(R.id.my_webview)

// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
}

Java

import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;

// You still get your WebView instance the standard way.
WebView webView = findViewById(R.id.my_webview);

// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON);
}

Jetpack Webkit को लागू करना

Jetpack Webkit को लागू करने के लिए, यह तरीका अपनाएं.

पहला चरण: डिपेंडेंसी जोड़ना

Jetpack Webkit जोड़ने के लिए, अपने मॉड्यूल की build.gradle.kts या build.gradle फ़ाइल में, यह डिपेंडेंसी शामिल करें:

ग्रूवी

dependencies {
    implementation "androidx.webkit:webkit:1.14.0"
}

Kotlin

dependencies {
    implementation("androidx.webkit:webkit:1.14.0")
}

Jetpack Webkit में थिन रैपर होते हैं. इसलिए, आपके ऐप्लिकेशन के साइज़ पर इसका असर बहुत कम पड़ता है.

दूसरा चरण: सुविधा का पता लगाने के पैटर्न को अपनाना

उपलब्ध न होने वाले एपीआई को शुरू करने पर ऐप्लिकेशन क्रैश होने से रोकने के लिए, सुविधा की जांच करने वाली सुविधा का इस्तेमाल करें. हमारा सुझाव है कि हर एपीआई इनवॉकेशन के साथ, सुविधा की जांच करें. साथ ही, जब एपीआई उपलब्ध न हो, तब फ़ॉलबैक लॉजिक का इस्तेमाल करें.

हमारा सुझाव है कि मॉडर्न WebView API का इस्तेमाल करने के लिए, इस पैटर्न का इस्तेमाल करें:

import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature

// In your Kotlin code where you configure your WebView
val webView: WebView = findViewById(R.id.my_webview)

// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    // If the check passes, it is safe to call the API.
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
} else {
    // Optionally, provide a fallback for older WebView versions.
}

इस पैटर्न से, यह पक्का करने में मदद मिलती है कि ऐप्लिकेशन मज़बूत है. सुविधा की जांच पहले होती है. इसलिए, अगर सुविधा उपलब्ध नहीं है, तो ऐप्लिकेशन क्रैश नहीं होता. WebViewFeature#isFeatureSupported() की जांच करने से परफ़ॉर्मेंस पर बहुत कम असर पड़ता है.