Z tego przewodnika dowiesz się, jakie są zalety biblioteki Jetpack Webkit, jak ona działa i jak możesz ją wdrożyć w swoich projektach.
Omówienie
Komponenty WebView są niezbędne w procesie tworzenia aplikacji na Androida, ale czasami trudno nimi zarządzać ze względu na niespójności w funkcjach w różnych wersjach systemu operacyjnego Android. Każda wersja Androida udostępnia stały zestaw interfejsów API WebView. Android jest udostępniany rzadziej niż WebView, więc interfejsy API Androida mogą nie obejmować wszystkich dostępnych funkcji WebView. Prowadzi to do wolniejszego wdrażania funkcji i zwiększenia kosztów testowania.
Jetpack Webkit rozwiązuje te problemy, działając jako warstwa zgodności i wykorzystując aktualny plik APK komponentu WebView na urządzeniu użytkownika. Zawiera też nowe i nowoczesne interfejsy API, które są dostępne wyłącznie w tej bibliotece.
Dlaczego warto używać Jetpack Webkit?
Jetpack Webkit zapewnia nie tylko zgodność między wersjami, ale też nowe i nowoczesne interfejsy API, które mogą uprościć proces tworzenia aplikacji i zwiększyć jej funkcjonalność:
Umożliwia uwierzytelnianie nowoczesne: komponent WebView może bezproblemowo obsługiwać nowoczesne standardy uwierzytelniania w internecie, takie jak WebAuthn, co umożliwia logowanie za pomocą kluczy dostępu. Biblioteka
androidx.webkit
daje Ci pełną kontrolę nad tą integracją za pomocą metodyWebSettingsCompat.setWebAuthenticationSupport()
, której możesz użyć do skonfigurowania poziomu obsługi wymaganego przez Twoją aplikację.Poprawia wydajność: dostosuj wydajność WebView do przypadków użycia w aplikacji za pomocą interfejsów API, takich jak
prefetchUrlAsync
,prerenderUrlAsync
isetBackForwardCacheEnabled
.Zwiększa stabilność: przywraca działanie zawieszonych lub niereagujących procesów renderowania bez powodowania awarii. Więcej informacji znajdziesz w sekcji
WebViewRenderProcess#terminate()
.Oferuje szczegółową kontrolę nad danymi przeglądania: aby usunąć dane przeglądania przechowywane przez WebView w przypadku określonych źródeł, użyj klasy
WebStorageCompat
.
Omówienie komponentów
Aby skutecznie korzystać z Jetpack Webkit, musisz rozumieć relacje między tymi komponentami:
Android System WebView: to oparty na Chromium silnik renderowania, który Google regularnie aktualizuje w Sklepie Google Play z taką samą częstotliwością jak Chrome. Zawiera on najnowsze funkcje i kod implementacji wszystkich interfejsów WebView API.
Interfejsy API platformy (
android.webkit
): są one przypisane do konkretnej wersji systemu operacyjnego Android. Na przykład aplikacja na Androidzie 10 może mieć dostęp tylko do interfejsów API, które były dostępne w momencie wydania tej wersji. Nie może więc korzystać z nowych funkcji dodanych do pliku APK WebView w nowszych aktualizacjach. Na przykład, aby uzyskać dostęp do nieodpowiadającego renderera za pomocąWebView#getWebViewRenderProcess()
, możesz wywołać tę funkcję tylko na Androidzie 10 lub nowszym.Biblioteka Jetpack Webkit (
androidx.webkit
): to mała biblioteka dołączona do aplikacji. Ta biblioteka działa jako pomost, który wywołuje plik APK WebView, zamiast wywoływać interfejsy API zdefiniowane na platformie Android, która ma stałą wersję systemu operacyjnego. Dzięki temu nawet jeśli aplikacja jest zainstalowana na urządzeniu z starszą wersją systemu operacyjnego, np. Androidem 10, może korzystać z najnowszych funkcji WebView. Na przykładWebViewCompat.getWebViewRenderProcess()
działa podobnie jak interfejs Framework API, ale można go też wywoływać we wszystkich wersjach systemu operacyjnego starszych niż Android 10.
Jeśli interfejs API jest dostępny zarówno w frameworku, jak i w Jetpack Webkit, zalecamy wybranie wersji Jetpack Webkit. Dzięki temu zapewniamy spójne działanie i kompatybilność na jak największej liczbie urządzeń.
Interakcja Jetpack Webkit i pliku APK
Interfejsy API w Jetpack Webkit są implementowane w 2 częściach:
Statyczny Jetpack Webkit: statyczna biblioteka Jetpack Webkit zawiera mniejszą część kodu odpowiedzialnego za implementację interfejsu API.
APK WebView: zawiera większość kodu.
Aplikacja wywołuje interfejs Jetpack Webkit API, który następnie wywołuje plik APK WebView.
W aplikacji możesz kontrolować wersję Jetpack Webkit, ale nie możesz kontrolować aktualizacji pliku APK WebView na urządzeniach użytkowników. Zazwyczaj większość użytkowników ma aktualne wersje pliku APK WebView, ale aplikacja musi uważać, aby nie wywoływać interfejsów API, których dana wersja pliku APK WebView nie obsługuje.
Jetpack Webkit eliminuje też konieczność ręcznego sprawdzania wersji WebView.
Aby sprawdzić, czy funkcja jest dostępna, poszukaj jej stałej. Na przykład WebViewFeature.WEB_AUTHENTICATION
.
Jak to działa
Jetpack Webkit wypełnia lukę między statycznym interfejsem API platformy a często aktualizowanym plikiem APK WebView. Gdy używasz interfejsu Jetpack Webkit API ze wzorcem wykrywania funkcji, biblioteka sprawdza, czy funkcja jest obsługiwana przez plik APK WebView zainstalowany na urządzeniu użytkownika. Dzięki temu nie musisz sprawdzać wersji systemu Android (frameworka).
Jeśli plik APK WebView jest w wystarczająco nowej wersji, biblioteka wywołuje tę funkcję. Jeśli nie, zgłasza, że funkcja jest niedostępna, co zapobiega awarii aplikacji i umożliwia odpowiednie zareagowanie na tę sytuację.
Porównanie interfejsów API Jetpack Webkit i Framework
W tej sekcji porównujemy metody implementacji z użyciem biblioteki Jetpack Webkit i bez niej:
Włączanie uwierzytelniania nowoczesnego (WebAuthn)
Bez Jetpack Webkit
Nie jest to możliwe w przypadku interfejsów API platformy.
Z Jetpack Webkit
Wykorzystuje WebViewFeature.WEB_AUTHENTICATION
do sprawdzania zgodności.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
WebSettingsCompat.setWebAuthenticationSupport(
webView.settings,
WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
)
}
Usuwanie danych dotyczących źródła (pamięć masowa witryny)
Bez Jetpack WebKit
Brak bezpośredniego interfejsu API do usuwania danych konkretnego źródła. Często wymaga wyczyszczenia wszystkich danych.
Z Jetpack WebKit
Korzysta z interfejsów API zgodności, aby precyzyjnie usuwać dane. Możesz skorzystać z jednej z tych opcji:
WebStorageCompat.getInstance().deleteBrowsingData()
Lub
WebStorageCompat.getInstance().deleteBrowsingDataForSite()
Pobieranie wersji WebView
Bez Jetpack WebKit
Korzysta ze standardowej klasy platformy.
val webViewPackage = WebView.getCurrentWebViewPackage()
Z Jetpack WebKit
Korzysta z warstwy zgodności, aby bezpieczniej pobierać dane.
val webViewPackage = WebViewCompat.getCurrentWebViewPackage()
Obsługa mechanizmu renderowania, który nie odpowiada (klient mechanizmu renderowania)
Bez Jetpack WebKit
Korzysta ze standardowej metody ramowej.
webView.setWebViewRenderProcessClient(myClient)
Z Jetpack WebKit
Używa WebViewCompat i sprawdzania funkcji do ustawiania klienta.
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}
Więcej informacji znajdziesz w androidx.webkit
dokumentacji.
Zintegruj Jetpack Webkit z kodem
Korzystanie z Jetpack Webkit zwiększa możliwości standardowej klasy WebView, ale nie zastępuje jej całkowicie.
Możesz nadal korzystać z klasy android.webkit.WebView
. Możesz dodać go do układów XML i uzyskać odwołanie do instancji w kodzie. Aby uzyskać dostęp do standardowych funkcji platformy, nadal możesz wywoływać metody bezpośrednio w instancji WebView lub w jej obiekcie ustawień.
Aby uzyskać dostęp do nowoczesnych funkcji, użyj statycznych metod pomocniczych udostępnianych przez Jetpack Webkit, takich jak WebViewCompat
i WebSettingsCompat
. Do tych metod przekazujesz istniejącą instancję 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);
}
Wdrażanie Jetpack Webkit
Aby wdrożyć Jetpack Webkit, wykonaj te czynności.
Krok 1. Dodaj zależność
Aby dodać Jetpack Webkit, w pliku build.gradle.kts
lub build.gradle
modułu uwzględnij tę zależność:
Odlotowe
dependencies { implementation "androidx.webkit:webkit:1.14.0" }
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.14.0") }
Jetpack Webkit zawiera cienkie otoki, więc wpływ na rozmiar aplikacji jest minimalny.
Krok 2. Zastosuj wzorzec wykrywania funkcji
Aby zapobiec awariom podczas wywoływania niedostępnych interfejsów API, używaj sprawdzania funkcji. Zalecamy otoczenie każdego wywołania interfejsu API sprawdzaniem funkcji, a także rozważenie logiki rezerwowej na wypadek, gdy interfejs API jest niedostępny.
Zalecamy stosowanie tego wzorca korzystania z nowoczesnego interfejsu 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.
}
Ten wzorzec pomaga zapewnić niezawodność aplikacji. Ponieważ najpierw sprawdzana jest dostępność funkcji, aplikacja nie ulegnie awarii, jeśli funkcja nie jest dostępna. Obciążenie wydajności związane ze sprawdzaniem WebViewFeature#isFeatureSupported()
jest znikome.