在 WebView 中完成 AdBlock

Fun*_*ive 5 android android-webview

我即将在我的 Android 应用程序中推出 WebView AdBlocking。我想知道这是否会有效地阻止广告,或者在 Webview 本身内是否还有更多工作要做,而我还没有修改。基本上我有一个存储在 Android 资产中的主机文件,其中列出了数百个广告服务器站点。我将此文件读入 AdBlocker,然后将其应用到 WebViewClient 中,如下所示:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

我只在 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);
}
Run Code Online (Sandbox Code Playgroud)

同样:

 @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);
}
Run Code Online (Sandbox Code Playgroud)

还有什么需要做的吗?或者就是这样?是否需要保留白名单,或者假设我的广告服务器列表是最新的,这通常会起作用吗?

Mik*_*nov 3

这个实现与Cordova 中的“白名单”功能基本相同。它们还用于shouldInterceptRequest阻止对非白名单站点的请求。这种方法有一些已知的简写,例如,它不能捕获通过 WebSockets 协议完成的请求(请参阅本书摘录),但总的来说,这是一种推荐的方法(在该文档中查找shouldInterceptRequest)。

为了做得更好,您需要自己加载所有内容(使用某些 HTTP 客户端),过滤并清理内容,然后将结果传递给 WebView 以便渲染。例如,GMail Android 应用程序就是这样工作的(它们在服务器上进行实际的清理,但也可以在设备上进行)。