WebView nesnelerini yönetme

Android, WebView. Web içeriğini uygulamanızda görüntüleyen nesneler.

Bu sayfada, WebView ile çalışmak için bu API'lerin nasıl kullanılacağı açıklanmaktadır. Nesneleri daha etkili bir şekilde etkileyerek uygulamanızın kararlılığını ve güvenliğini artırır.

Sürüm API'si

Android 7.0 (API düzeyi 24) sürümünden itibaren, kullanıcılar çeşitli seçenekler arasından seçim yapabilir WebView nesnesinde web içeriğini görüntülemek için farklı paketler. AndroidX.webkit kitaplık getCurrentWebViewPackage() web'i görüntüleyen paketle ilgili bilgileri getirme yöntemi ekleyebilirsiniz. Bu yöntem yalnızca meydana gelen hataların analiz edilmesinde Uygulamanız, belirli bir paketin özelliklerini kullanarak web içeriğini görüntülemeye çalıştığında WebView uygulanması.

Bu yöntemi kullanmak için aşağıdaki kod snippet'inde gösterilen mantığı ekleyin:

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 Güvenli Tarama Hizmeti

Kullanıcılarınıza daha güvenli bir tarama deneyimi sunmak için WebView nesneleri tanımlamak için: Google Güvenli Tarama, Böylece uygulamanız, belirli bir yere gitmeye çalışan kullanıcılara bir uyarı gösterebilir. güvenli olmayabilecek bir web sitesidir.

EnableSafeBrowsing öğesinin varsayılan değeri doğru olsa da Güvenli Tarama'yı yalnızca koşullu olarak veya devre dışı bırakabilirsiniz. Android 8.0 (API düzeyi 26) ve sonraki sürümler setSafeBrowsingEnabled() Güvenli Tarama'yı tek bir WebView nesnesi için açıp kapatın.

WebView nesnenin tümünün Güvenli Tarama'yı devre dışı bırakmasını istiyorsanız denetimlerinden sonra, aşağıdaki <meta-data> öğesini uygulamanızın manifesto dosyası:

<manifest>
    <application>
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="false" />
        ...
    </application>
</manifest>

Programatik işlemleri tanımlayın

Bir WebView örneği şu boyutta bir sayfayı yüklemeye çalıştığında: Google tarafından bilinen tehdit olarak sınıflandırılmıştır (varsayılan olarak WebView) Bilinen tehdit konusunda kullanıcıları uyaran bir geçiş reklamı gösterir. Bu ekranda kullanıcılara URL'yi yine de yükleme veya farklı bir web sitesini ziyaret eden güvenli.

Android 8.1 (API düzeyi 27) veya sonraki sürümleri hedeflerseniz aşağıdaki durumlarda uygulamanızın bilinen bir tehdide nasıl yanıt verdiğini programatik olarak yöntemler:

  • Uygulamanızın, Güvenli Arama'ya yönelik bilinen tehditleri raporlayıp raporlamayacağını kontrol edebilirsiniz Göz atma.
  • Uygulamanızın otomatik olarak belirli bir işlemi gerçekleştirmesini sağlayabilirsiniz: güvenli değildir. Aynı şekilde güvenli olmayan bir URL ile bilinen bir tehdit olarak sınıflandırılmıştır.
ziyaret edin.

Aşağıdaki kod snippet'lerinde, uygulamanızın Bilinen bir sorunla karşılaştıktan sonra her zaman güvenli bir yere gitmek için WebView tehdit:

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 Coğrafi Konum API'si

Android 6.0 (API düzeyi 23) ve sonraki sürümleri hedefleyen uygulamalar için Geolocation API yalnızca HTTPS gibi güvenli kaynaklarda desteklenir. Güvenli olmayan kaynaklardaki Geolocation API, çağrı yapılmadan otomatik olarak reddedildi karşılık gelen onGeolocationPermissionsShowPrompt() yöntemi.

Metrik toplamayı devre dışı bırak

WebView, anonim teşhis verilerini şuraya yükleyebilir: Kullanıcı izin verdiğinde Google. Veriler uygulama bazında toplanır WebView öğesi oluşturan her uygulama için geçerlidir. Bunu devre dışı bırakabilirsiniz manifest dosyasında aşağıdaki etiketi oluşturarak <application> öğe:

<manifest>
    <application>
    ...
    <meta-data android:name="android.webkit.WebView.MetricsOptOut"
               android:value="true" />
    </application>
</manifest>

Veriler yalnızca kullanıcının izin vermesi ve uygulama devre dışı bırakmıyor. Teşhis verilerini devre dışı bırakma hakkında daha fazla bilgi için daha fazla bilgi için Web Görünümü'nde kullanıcı gizliliği raporlama bölümüne gidin.

Fesih İşleme API'sı

Fesih Process API, bir WebView. bunun nedeni sistem, oluşturucuyu öldürerek nedeni olabilir veya oluşturucu işlemi çökebilir. Bu API'yi kullanarak oluşturucu işlemi kopsa bile uygulamanızın çalışmaya devam etmesini sağlar.

Bir oluşturucu belirli bir web sayfasını yüklerken kilitlenirse aynı sayfayı tekrar yüklemek, yeni bir WebView nesnesinin aynı oluşturma kilitlenme davranışını gösterir.

Aşağıdaki kod snippet'i, bu API'nin 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;
    }
}

Oluşturucu Önem API'si

WebView nesne olduğunda operasyonel (çok işlemli modda), uygulamanızın bunları nasıl ele alacağı konusunda biraz esnek durumu hakkında daha fazla bilgi edineceksiniz. Şurada açıklanan Renderer Importance API'sını kullanabilirsiniz: Belirli bir kullanıcıya atanan oluşturucu için öncelik politikası ayarlamak üzere Android 8.0 WebView nesne algılandı. Özellikle, satış ekibinizin uygulamanızın WebView nesne öldürüldü. Örneğin, şunları yapabilirsiniz: WebView nesnesini uzun süre göstermemeyi sistem, oluşturucunun kullandığı belleği geri alabilir.

Aşağıdaki kod snippet'inde, oluşturucuya nasıl öncelik atanacağı gösterilmektedir uygulamanızın WebView nesneleriyle ilişkili işlem:

Kotlin

val myWebView: WebView = ...
myWebView.setRendererPriorityPolicy(RENDERER_PRIORITY_BOUND, true)

Java

WebView myWebView;
myWebView.setRendererPriorityPolicy(RENDERER_PRIORITY_BOUND, true);

Bu snippet'te oluşturucunun önceliği için varsayılan öncelik olur. true bağımsız değişken, oluşturucunun önceliğini RENDERER_PRIORITY_WAIVED (ilişkilendirilmiş WebView nesnesi artık görünür olmadığında) Başka bir true bağımsız değişkeni, uygulamanızın oluşturucu işlemini devam ettirir. Aslında bu düşük öncelik düzeyi oluşturucu işleminin bellek dışında sonlandırılma ihtimalini doğurur durumlardan birine sahip olmaları halinde başlatabilirler.

Sistemin düşük bellek durumlarını nasıl ele aldığı hakkında daha fazla bilgi edinmek için bkz. Süreçler ve uygulama yaşam döngüsü boyunca geçerlidir.