Android realizacja WebKit pozwala programiście zmodyfikować WebView przez klasę android.webkit.WebSettings takich jak
- obsługą JavaScriptu
- wsparcie dla wtyczek,
- File System Access
- zasobów Inspection itp.
W Inspekcja zasobów, możliwe jest sprawdzenie żądań dotyczących treści i/lub zasobów przez zastąpienie metod: shouldOverrideUrlLoading i shouldInterceptRequest.
Ale przede dwóch metod jest wykorzystanie do różnych celów, takich jak
1. shouldOverrideUrlLoading
jest wywoływana, gdy nowa strona ma być otwarta podczas shouldInterceptRequest
nazywa każdym razem, gdy zasób jest załadowany jak plik css, js plik itp.
2.Jeśli użytkownik interaktywnie zażąda zasobu z poziomu WebView, możliwe jest zastosowanie metody shouldOverrideUrlLoading
klasy WebViewClient
do przechwycenia żądania. Przykładowy kod przedstawiono poniżej. Source
private class MyWebViewClient extends WebViewClient {
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals("www.google.com")) {
return true;
}
return false;
}
}
Metoda daje aplikacji hosta szansę przejąć kontrolę, gdy nowy adres URL ma być załadowany w bieżącym WebView. Zwracana wartość true oznacza, że aplikacja hosta obsługuje adres URL, a return false oznacza, że bieżący WebView obsługuje adres URL. Powyższy kod zapobiega ładowaniu zasobów z hosta "www.google.com".
Jednak metoda nie przechwytuje ładowania zasobów z wnętrza, na przykład z IFRAME lub atrybutu src w tagu HTML lub SCRIPT na przykład. Dodatkowo XmlHttpRequests również nie zostaną przechwycone. Aby przechwycić te żądania, możesz skorzystać z metody WebViewClient shouldInterceptRequest
. Przykładowy kod przedstawiono poniżej.
@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
if (url.contains(".js")) {
return getWebResourceResponseFromString();
} else {
return super.shouldInterceptRequest(view, url);
}
}
private WebResourceResponse getWebResourceResponseFromString() {
return getUtf8EncodedWebResourceResponse(new StringBufferInputStream("alert('!NO!')"));
}
private WebResourceResponse getUtf8EncodedWebResourceResponse(InputStream data) {
return new WebResourceResponse("text/javascript", "UTF-8", data);
}
Ta metoda powiadamia aplikację hosta o żądaniu zasobu i umożliwia aplikacji zwrócenie danych. Jeśli zwrócona wartość jest pusta, WebView będzie nadal ładował zasób w zwykły sposób. W przeciwnym razie zostanie wykorzystana odpowiedź zwrotna i dane. Powyższy kod przechwytuje żądania dotyczące zasobów JavaScript (.js) i zwraca alert zamiast żądanego zasobu.
Zobacz więcej na: WebViewClient shouldOverrideUrlLoading i shouldInterceptRequest
Najwyraźniej shouldOverrideUrlLoading() nie zostanie wywołana, gdy loadUrl nazywa się po raz pierwszy. Wbrew powszechnemu przekonaniu, powinno wywołaćOverrideUrlLoading(), gdy zostanie kliknięte łącze wewnętrzne z już załadowanej strony internetowej. – AnupamChugh