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 तरीके का इस्तेमाल किया जाता है. इसका इस्तेमाल करके, यह कॉन्फ़िगर किया जा सकता है कि आपके ऐप्लिकेशन को किस लेवल के सपोर्ट की ज़रूरत है.

  • परफ़ॉर्मेंस बेहतर होती है: setBackForwardCacheEnabled जैसे एपीआई का इस्तेमाल करके, वेबव्यू की परफ़ॉर्मेंस को बेहतर बनाएं. इसके अलावा, prefetchUrlAsync और prerenderUrlAsync जैसे अनुमान के हिसाब से यूआरएल लोड होने की सुविधा वाले एपीआई का इस्तेमाल करके, नेविगेशन में लगने वाले समय को कम करें. ज़्यादा जानकारी के लिए, WebView में अनुमान के हिसाब से यूआरएल लोड होने की सुविधा लेख पढ़ें.

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

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

  • पेज नेविगेशन की बेहतर सुविधा देता है: नेविगेशन को ज़्यादा बारीकी से कंट्रोल करने, इतिहास की एंट्री बदलने, सेव किए गए स्टेट हेडर के साथ काम करने, और NavigationListener का इस्तेमाल करके लाइफ़साइकल को ट्रैक करने के लिए, WebView.loadUrl को WebViewCompat.navigate से बदलें. ज़्यादा जानकारी के लिए, WebViewCompat.navigate की मदद से पेज पर बेहतर तरीके से नेविगेट करना लेख पढ़ें.

  • स्टेट मैनेजमेंट को ऑप्टिमाइज़ करता है: स्टेट सीरियलाइज़ेशन के दौरान बाइट की ज़्यादा से ज़्यादा सीमाएं सेट करके, TransactionTooLargeException से सुरक्षा करता है. ज़्यादा जानकारी के लिए, WebView की स्थिति को असरदार तरीके से मैनेज करना लेख पढ़ें.

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

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

  • Android सिस्टम का वेबव्यू: यह 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)
}

क्रैश रिकवरी की रणनीतियां लागू करने के बारे में दिशा-निर्देश पाने के लिए, WebView बंद होने की समस्या को हल करना लेख पढ़ें. एपीआई के बारे में ज़्यादा जानकारी के लिए, androidx.webkit रेफ़रंस दस्तावेज़ देखें.

सेव की गई स्थिति और लेन-देन का साइज़ मैनेज करना

WebViewCompat.saveState एपीआई की मदद से, बाइट की सीमाएं लागू की जा सकती हैं. साथ ही, क्रम से लगाने के दौरान आगे के इतिहास को छोटा किया जा सकता है. इससे TransactionTooLargeException क्रैश होने से बचते हैं. साथ ही, नेविगेशन के ज़रूरी इतिहास को सुरक्षित रखा जा सकता है.

Jetpack WebKit के बिना

यह स्टैंडर्ड फ़्रेमवर्क के तरीके का इस्तेमाल करता है. यह साइज़ की सीमाओं के बिना, पूरे नेविगेशन स्टैक को क्रम से लगाता है. साथ ही, अगर पेलोड, Android की 1 एमबी की लेन-देन की सीमा से ज़्यादा हो जाता है, तो TransactionTooLargeException को ट्रिगर कर सकता है.

webView.saveState(outState)

Jetpack WebKit की मदद से

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

WebViewCompat.saveState(webView, outState, maxSizeBytes)

ज़्यादा जानकारी के लिए, WebView की स्थिति को असरदार तरीके से मैनेज करना लेख पढ़ें.

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

Jetpack WebKit के बिना

WebView.loadUrl का इस्तेमाल करता है. इसमें इतिहास की एंट्री बदलने या लाइफ़साइकल के कॉलबैक को ट्रैक करने की सुविधा नहीं होती.

webView.loadUrl("https://www.example.com")

Jetpack WebKit की मदद से

यह कुकी, इतिहास की एंट्री बदलने, सेव की गई स्थिति में कस्टम हेडर बनाए रखने, और नेविगेशन की स्थितियों को ट्रैक करने के लिए, WebViewCompat.navigate के साथ NavigationParameters का इस्तेमाल करती है.

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEBVIEW_NAVIGATE_EXPERIMENTAL_V1)) {
  val params = NavigationParameters.Builder()
      .setShouldReplaceCurrentEntry(true)
      .build()
  val navigation = WebViewCompat.navigate(webView, "https://www.example.com", params)
} else {
  webView.loadUrl("https://www.example.com")
}

नेविगेशन ट्रैकिंग और पैरामीटर कॉन्फ़िगरेशन के बारे में ज़्यादा जानकारी के लिए, WebViewCompat.navigate की मदद से पेज नेविगेशन को बेहतर बनाना लेख पढ़ें.

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

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

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

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

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.16.0"
}

Kotlin

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

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

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

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

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

Kotlin

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

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.
}

Java

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

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.getSettings(), WebSettingsCompat.FORCE_DARK_ON);
} else {
    // Optionally, provide a fallback for older WebView versions.
}

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