【问题标题】:Complete AdBlock inside WebView在 WebView 内完成 AdBlock
【发布时间】:2016-06-11 12:20:36
【问题描述】:

我即将在我的 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;
}

而且我只在 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);
}

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

【问题讨论】:

标签: android android-webview


【解决方案1】:

这个实现与"whitelist" feature in Cordova基本相同。他们还使用shouldInterceptRequest 来阻止对非白名单站点的请求。这种方法有已知的速记,例如它不会捕获通过 WebSockets 协议完成的请求(请参阅 this book excerpt),但通常它是 recommended approach(在该文档中查找 shouldInterceptRequest)。

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

【讨论】:

  • 好的,我查看了 Jericho html 解析器的一些清理功能。也许可以使用那个或JSoup ....
  • 这种解析还有其他好的开源库吗?我也在考虑实施一种阅读器模式,当然这将不允许广告
  • 是的,JSoup 似乎是 Java 的一个很好的解决方案。但这是一个复杂的问题,值得单独写一篇文章。例如。是否允许 JavaScript 动态生成内容?我会说shouldInterceptRequest 将适用于 90% 的情况,而解决剩下的 10% 真的很难。
【解决方案2】:

如果有人正在寻找更简单的方法来执行此操作,AdBlock plus Github 页面提供了AdblockWebView。要使用它,请将此行添加到 Gradle 文件中:

implementation 'org.adblockplus:adblock-android-webview:3.0'

然后将其添加到布局的 XML 文件中:

<org.adblockplus.libadblockplus.android.webview.AdblockWebView
    android:id="@+id/main_webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

【讨论】:

    猜你喜欢
    • 2019-10-03
    • 2012-09-28
    • 2016-12-22
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多