वेबव्यू ऑब्जेक्ट मैनेज करें

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 से, किसी अनजान व्यक्ति से मिलने के बाद हमेशा सुरक्षित रहने के लिए खतरा:

MyWebActivity.java

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!");
                }
            }
        });
    }
}

MyWebViewClient.java

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 आर्ग्युमेंट बताता है कि आपका ऐप्लिकेशन इस बात की तो सिस्टम रेंडरर की प्रोसेस को चालू रखता है. वास्तव में, यह निम्न प्राथमिकता स्तर इस बात की संभावना होती है कि रेंडरर प्रोसेस, मेमोरी के बाहर खत्म हो जाएगी स्थितियों के बारे में बताना.

मेमोरी में कम जगह होने की समस्याओं को कैसे हैंडल किया जाता है, इस बारे में ज़्यादा जानने के लिए देखें प्रोसेस और ऐप्लिकेशन लाइफ़साइकल.