2016-02-28 2 views
2

Я собираюсь запустить WebView AdBlocking в моем приложении для Android. Я хочу знать, будет ли это эффективно блокировать рекламу или если еще что-то сделать, скажем в самом веб-обозревателе, которое я не изменил. В основном у меня есть файл хоста, хранящийся в активах Android, в котором перечислены сотни сайтов рекламного сервера. Я прочитал этот файл в моей AdBlocker, а затем применить его внутрь WebViewClient следующим образом:Завершить AdBlock внутри WebView

// AdBlocker.isAdURL(String url) 

public Boolean isAdURL(String url){ 
     Boolean retValue = false; 
     if ((url == null) || (url.isEmpty())) 
     return false; 
     if ((adServers == null)|| (adServers.size() <1)) 
     return false; 
     try{ 
     String domainName = getUrlsDomain(url); 
     if (adServers.contains(domainName)) { 
      retValue = true; 
     } 
    } catch(URISyntaxException e){ 

    } 

    return retValue; 
} 

И я использую это только в WebViewClient следующим образом:

@Deprecated 
@Override 
public WebResourceResponse shouldInterceptRequest(WebView view, String url) { 

     if (adBlocker.isAdURL(url)) { 
     ByteArrayInputStream nada = new ByteArrayInputStream("".getBytes()); 
     return new WebResourceResponse("text/plain", "utf-8", nada); 
    } 
    return super.shouldInterceptRequest(view, url); 
} 

И точно так же:

@Override 
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     if (adBlocker.isAdURL(request.getUrl().toString())) { 
      ByteArrayInputStream nada = new ByteArrayInputStream("".getBytes()); 
      return new WebResourceResponse("text/plain", "utf-8", nada); 
     } 

    } 

    return super.shouldInterceptRequest(view, request); 
} 

Что-нибудь еще нужно сделать? Или это так? Любая потребность сохранить белый список или будет ли это вообще работать, если мой список рекламных серверов будет текущим?

+0

_could вы можете разместить свою функцию getUrlsDomain (url)? _ -> неважно, нашел ответ здесь: [link] (http://stackoverflow.com/questions/9607903/get-domain-name-from-given- url # 9608008) – xtools

ответ

1

Эта реализация в основном такая же, как у "whitelist" feature in Cordova. Они также используют shouldInterceptRequest для блокировки запросов к сайтам, не включенным в белый список. Известны известные варианты этого подхода, например. он не улавливает запросы, выполняемые через протокол WebSockets (см. this book excerpt), но в целом это recommended approach (ищите в этом документе shouldInterceptRequest).

Для того, чтобы сделать лучше, вам нужно будет загружать все содержимое самостоятельно (используя некоторый HTTP-клиент), отфильтровывать и дезинфицировать контент, а затем передавать результаты в WebView для рендеринга. Так работает приложение GMail Android (они выполняют фактическую санитацию на сервере, но это также возможно сделать на устройстве).

+0

Хорошо, я просмотрел парсер Jericho html для некоторых возможностей очистки. Возможно, это или JSoup можно использовать .... – FunctionallyReactive

+0

Существуют ли другие хорошие библиотеки с открытым исходным кодом для этого типа разбора? Я также рассматриваю реализацию режима чтения, который, конечно же, не разрешил бы объявления – FunctionallyReactive

+0

Да, JSoup кажется хорошим решением для Java. Но это сложный вопрос, заслуживающий самостоятельной статьи. Например. Вы хотите разрешить динамическое создание контента с помощью JavaScript? Я бы сказал, что 'shouldInterceptRequest' будет работать в 90% случаев, а решение остальных 10% действительно сложно. –

Смежные вопросы