Android, कई एपीआई की सुविधा देता है, ताकि
WebView
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
ऐसे ऑब्जेक्ट जो आपके ऐप्लिकेशन में वेब कॉन्टेंट दिखाते हैं.
इस पेज पर बताया गया है कि WebView
के साथ काम करने के लिए, इन एपीआई का इस्तेमाल कैसे किया जा सकता है
ज़्यादा असरदार तरीके से, आपके ऐप्लिकेशन की स्थिरता और सुरक्षा को बेहतर बनाता है.
वर्शन एपीआई
Android 7.0 (एपीआई लेवल 24) के बाद के वर्शन में, उपयोगकर्ता कई विकल्पों में से कोई भी विकल्प चुन सकते हैं
किसी WebView
ऑब्जेक्ट में वेब कॉन्टेंट दिखाने के लिए, अलग-अलग पैकेज शामिल हैं.
AndroidX.webkit
लाइब्रेरी में
getCurrentWebViewPackage()
वेब को प्रदर्शित करने वाले पैकेज से संबंधित जानकारी प्राप्त करने का तरीका
वाला कॉन्टेंट भी हो सकता है. यह तरीका, सिर्फ़ होने वाली गड़बड़ियों का विश्लेषण करने के लिए कारगर है
जब आपका ऐप्लिकेशन किसी खास पैकेज का इस्तेमाल करके वेब कॉन्टेंट दिखाने की कोशिश करता है
WebView
को लागू करना.
इस तरीके का इस्तेमाल करने के लिए, इस कोड स्निपेट में दिखाया गया लॉजिक जोड़ें:
Kotlin
val webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(appContext) Log.d("MY_APP_TAG", "WebView version: ${webViewPackageInfo.versionName}")
Java
PackageInfo webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(appContext); Log.d("MY_APP_TAG", "WebView version: " + webViewPackageInfo.versionName);
Google सुरक्षित ब्राउज़िंग सेवा
लोगों को सुरक्षित ब्राउज़िंग का अनुभव देने के लिए, WebView
ऑब्जेक्ट, इनका इस्तेमाल करके यूआरएल की पुष्टि करते हैं
Google सुरक्षित ब्राउज़िंग,
इससे आपका ऐप्लिकेशन, लोगों को चेतावनी दिखाता है. ऐसा तब होता है, जब वे
असुरक्षित वेबसाइट हो सकती है.
हालांकि EnableSafeBrowsing
का डिफ़ॉल्ट मान सही है, लेकिन वहां
सुरक्षित ब्राउज़िंग को सिर्फ़ शर्तों के साथ चालू करना चाहिए या
तो इसे बंद कर दें. Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन,
setSafeBrowsingEnabled()
किसी WebView
ऑब्जेक्ट के लिए, सुरक्षित ब्राउज़िंग की सुविधा को टॉगल करें.
अगर आपको सभी WebView
ऑब्जेक्ट को सुरक्षित ब्राउज़िंग की सुविधा से ऑप्ट आउट करना है
की जांच करता है, तो अपने ऐप्लिकेशन के<meta-data>
मेनिफ़ेस्ट फ़ाइल:
<manifest> <application> <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="false" /> ... </application> </manifest>
प्रोग्राम के हिसाब से, अपने-आप होने वाली कार्रवाइयों को तय करना
जब WebView
का कोई इंस्टेंस, ऐसे पेज को लोड करने की कोशिश करता है जो
Google ने एक जाने-पहचाने खतरे की कैटगरी में रखा है. डिफ़ॉल्ट रूप से WebView
अचानक दिखने वाला एक विज्ञापन दिखाया जाता है, जो उपयोगकर्ताओं को पहले से मालूम खतरे की चेतावनी देता है. यह स्क्रीन हमें
उपयोगकर्ता के पास यूआरएल को लोड करने या पिछले पेज पर वापस जाने का विकल्प होता है
सुरक्षित रखें.
अगर आपको Android 8.1 (एपीआई लेवल 27) या इसके बाद के वर्शन को टारगेट करना है, तो प्रोग्राम के हिसाब से आपका ऐप्लिकेशन यहां दी गई जानकारी में बताए गए खतरे से कैसे निपटता है तरीके:
- यह कंट्रोल किया जा सकता है कि आपका ऐप्लिकेशन, सुरक्षित कॉन्टेंट के लिए जाने-पहचाने खतरों की रिपोर्ट करे या नहीं ब्राउज़िंग.
- आप अपने ऐप्लिकेशन को कोई खास कार्रवाई अपने-आप करने के लिए सेट कर सकते हैं—जैसे वापस जाने के लिए—जब भी उसे किसी ऐसे URL का सामना करना पड़ता है जो आम तौर पर किए जाने वाले खतरे की कैटगरी में रखा जाता है.
नीचे दिए गए कोड स्निपेट, आपके ऐप्लिकेशन के इंस्टेंस को
WebView
से, किसी अनजान व्यक्ति से मिलने के बाद हमेशा सुरक्षित रहने के लिए
खतरा:
Kotlin
private lateinit var superSafeWebView: WebView private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this) superSafeWebView.webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false if (WebViewFeature.isFeatureSupported(WebViewFeature.START_SAFE_BROWSING)) { WebViewCompat.startSafeBrowsing(this, ValueCallback<Boolean> { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
Java
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; if (WebViewFeature.isFeatureSupported(WebViewFeature.START_SAFE_BROWSING)) { WebViewCompat.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); } }
Kotlin
class MyWebViewClient : WebViewClientCompat() { // Automatically go "back to safety" when attempting to load a website that // Google identifies as a known threat. An instance of WebView calls this // method only after Safe Browsing is initialized, so there's no conditional // logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponseCompat ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. if (WebViewFeature.isFeatureSupported(WebViewFeature.SAFE_BROWSING_RESPONSE_BACK_TO_SAFETY)) { callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } } }
Java
public class MyWebViewClient extends WebViewClientCompat { // Automatically go "back to safety" when attempting to load a website that // Google identifies as a known threat. An instance of WebView calls this // method only after Safe Browsing is initialized, so there's no conditional // logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponseCompat callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. if (WebViewFeature.isFeatureSupported(WebViewFeature.SAFE_BROWSING_RESPONSE_BACK_TO_SAFETY)) { callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } } }
HTML5 जियोलोकेशन एपीआई
Android 6.0 (एपीआई लेवल 23) और उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, Geolocation API
सिर्फ़ एचटीटीपीएस जैसे सुरक्षित ऑरिजिन पर ही काम करता है. इसके लिए कोई अनुरोध
असुरक्षित ऑरिजिन पर, जियोलोकेशन एपीआई को लागू किए बिना अपने-आप अस्वीकार कर दिया जाता है
onGeolocationPermissionsShowPrompt()
तरीका.
मेट्रिक कलेक्शन से ऑप्ट आउट करें
WebView
पहचान छिपाकर डाइग्नोस्टिक्स डेटा अपलोड कर सकता है
Google, जब उपयोगकर्ता सहमति देता है. डेटा हर ऐप्लिकेशन के हिसाब से इकट्ठा किया जाता है
WebView
को इंस्टैंशिएट करने वाले हर ऐप्लिकेशन के लिए. इससे ऑप्ट आउट किया जा सकता है
मेनिफ़ेस्ट फ़ाइल में नीचे दिया गया टैग बनाकर
<application>
एलिमेंट:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.MetricsOptOut" android:value="true" /> </application> </manifest>
ऐप्लिकेशन से डेटा सिर्फ़ तब अपलोड किया जाता है, जब उपयोगकर्ता इसकी सहमति देता है और ऐप्लिकेशन ऑप्ट आउट नहीं होता है. डाइग्नोस्टिक्स डेटा से ऑप्ट आउट करने के बारे में ज़्यादा जानकारी पाने के लिए रिपोर्टिंग के लिए, वेबव्यू में उपयोगकर्ता की निजता से जुड़ी जानकारी देखें रिपोर्टिंग के लिए.
खत्म होने की प्रक्रिया को मैनेज करने वाला एपीआई
End handling API, उन मामलों को हैंडल करता है जहां रेंडरर किसी
WebView
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
ऑब्जेक्ट हट जाता है, क्योंकि सिस्टम फिर से दावा करने के लिए रेंडरर को खत्म कर देता है
ज़रूरी मेमोरी होती है या रेंडरर की प्रोसेस क्रैश हो जाती है. इस एपीआई का इस्तेमाल करने पर,
रेंडरर प्रोसेस बंद होने पर भी, ऐप्लिकेशन काम करता रहेगा.
अगर कोई रेंडरर, किसी खास वेब पेज को लोड करते समय क्रैश हो जाता है
उसी पेज को फिर से लोड करने से नया WebView
ऑब्जेक्ट जनरेट हो सकता है
रेंडरिंग क्रैश होने पर एक जैसा व्यवहार दिखेगा.
नीचे दिया गया कोड स्निपेट दिखाता है कि
Activity
:
Kotlin
inner class MyRendererTrackingWebViewClient : WebViewClient() { private var mWebView: WebView? = null override fun onRenderProcessGone(view: WebView, detail: RenderProcessGoneDetail): Boolean { if (!detail.didCrash()) { // Renderer is killed because the system ran out of memory. The app // can recover gracefully by creating a new WebView instance in the // foreground. Log.e("MY_APP_TAG", ("System killed the WebView rendering process " + "to reclaim memory. Recreating...")) mWebView?.also { webView -> val webViewContainer: ViewGroup = findViewById(R.id.my_web_view_container) webViewContainer.removeView(webView) webView.destroy() mWebView = null } // By this point, the instance variable "mWebView" is guaranteed to // be null, so it's safe to reinitialize it. return true // The app continues executing. } // Renderer crashes because of an internal error, such as a memory // access violation. Log.e("MY_APP_TAG", "The WebView rendering process crashed!") // In this example, the app itself crashes after detecting that the // renderer crashed. If you handle the crash more gracefully and let // your app continue executing, you must destroy the current WebView // instance, specify logic for how the app continues executing, and // return "true" instead. return false } }
Java
public class MyRendererTrackingWebViewClient extends WebViewClient { private WebView mWebView; @Override public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) { if (!detail.didCrash()) { // Renderer is killed because the system ran out of memory. The app // can recover gracefully by creating a new WebView instance in the // foreground. Log.e("MY_APP_TAG", "System killed the WebView rendering process " + "to reclaim memory. Recreating..."); if (mWebView != null) { ViewGroup webViewContainer = (ViewGroup) findViewById(R.id.my_web_view_container); webViewContainer.removeView(mWebView); mWebView.destroy(); mWebView = null; } // By this point, the instance variable "mWebView" is guaranteed to // be null, so it's safe to reinitialize it. return true; // The app continues executing. } // Renderer crashes because of an internal error, such as a memory // access violation. Log.e("MY_APP_TAG", "The WebView rendering process crashed!"); // In this example, the app itself crashes after detecting that the // renderer crashed. If you handle the crash more gracefully and let // your app continue executing, you must destroy the current WebView // instance, specify logic for how the app continues executing, and // return "true" instead. return false; } }
रेंडरर इंपोर्टेंस एपीआई
जब WebView
ऑब्जेक्ट
इसमें संचालन करें
मल्टीप्रोसेस मोड में, आपके पास अपने ऐप्लिकेशन को मैनेज करने की सुविधा को अपने हिसाब से मैनेज करने की सुविधा मिलती है
स्टोरेज खत्म होने की समस्या हो सकती है. आप रेंडरर आयात API का इस्तेमाल कर सकते हैं, जिसे
Android 8.0, रेंडरर की प्राथमिकता नीति सेट करने के लिए
WebView
ऑब्जेक्ट. खास तौर पर, हो सकता है कि आपको
ऐप्लिकेशन, जो आपके ऐप्लिकेशन के
WebView
ऑब्जेक्ट को मार दिया गया है. उदाहरण के लिए, आप ऐसा कर सकते हैं, अगर
WebView
ऑब्जेक्ट को लंबे समय तक नहीं दिखाने की उम्मीद करते हैं, ताकि
सिस्टम उस मेमोरी पर फिर से दावा कर सकता है जिसका इस्तेमाल रेंडरर कर रहा था.
नीचे दिया गया कोड स्निपेट, रेंडरर को प्राथमिकता असाइन करने का तरीका बताता है
आपके ऐप्लिकेशन के WebView
ऑब्जेक्ट से जुड़ी प्रोसेस:
Kotlin
val myWebView: WebView = ... myWebView.setRendererPriorityPolicy(RENDERER_PRIORITY_BOUND, true)
Java
WebView myWebView; myWebView.setRendererPriorityPolicy(RENDERER_PRIORITY_BOUND, true);
इस खास स्निपेट में, रेंडरर की प्राथमिकता वही होती है जो—या
ऐप की डिफ़ॉल्ट प्राथमिकता से तय होता है. true
तर्क, रेंडरर की प्राथमिकता को
RENDERER_PRIORITY_WAIVED
जब संबंधित WebView
ऑब्जेक्ट अब नहीं दिखता. अन्य
शब्दों का इस्तेमाल करते हैं, तो true
आर्ग्युमेंट बताता है कि आपका ऐप्लिकेशन इस बात की
तो सिस्टम रेंडरर की प्रोसेस को चालू रखता है. वास्तव में, यह निम्न प्राथमिकता स्तर
इस बात की संभावना होती है कि रेंडरर प्रोसेस, मेमोरी के बाहर खत्म हो जाएगी
स्थितियों के बारे में बताना.
मेमोरी में कम जगह होने की समस्याओं को कैसे हैंडल किया जाता है, इस बारे में ज़्यादा जानने के लिए देखें प्रोसेस और ऐप्लिकेशन लाइफ़साइकल.