去掉百度网页下方百度app推荐的banner实战
ADBlock是浏览器必备的功能之一,ADBlock就是去掉网页广告功能,那么ios 浏览器(uiwebview)如何去广告勒,主要有两种形式的广告,一种是拦截服务器发送的URL,一种是dom元素隐藏,拦截URL这里有两种思路
1.利用NSURLProtocol 拦截网页所有的请求。然后拦截所有的请求,去掉带有广告的js,图片等资源
2.hook系统的- (NSURLRequest*)myWebView:(id)sender resource:(id)identifier willSendRequest:(NSURLRequest*)request redirectResponse:(NSURLResponse*)redirectResponse fromDataSource:(id)dataSource
这个方法拦截[request URL] 即可
dom元素隐藏是页面dom元素加载完成之后即webViewDidFinishLoad这个方法中,通过js脚本利用正则表达式匹配dom元素的进行隐藏
有了这两种操作90%的页面广告都可以拦截掉,但是最近pm提出需求,需要将m.baidu.com下方的banner广告进行拦截
经过多次试验,以上两种操作对拦截类似m.baidu.com下面的banner类似的广告都不行,那么该如何去掉它,经过手动点击✘掉广告,在下次访问的时候竟然没有广告,过了一两天,广告又出来,而且X掉广告的时候没有网络请求产生,会不会是点击✘的时候存本地了,那么浏览器的本地key value存在哪里,localStorage,果然,点击✘的时候localStorage多了index_fbannerios_lastclosetime和search_btmb_lastclosetime两个key值,那么就好解决了在加载完成的方法中加入如下代码
if([url.absoluteString rangeOfString:@"baidu.com/"].location != NSNotFound) {
longlongtimeStamp =(longlong)([[NSDate date] timeIntervalSince1970] *1000.0);
NSString *timeStampStr = [NSString stringWithFormat:@"%lld",timeStamp];
NSString *jsStr = [NSString stringWithFormat:@"window.localStorage.setItem('index_fbannerios_lastclosetime',%@) ; window.localStorage.setItem('search_btmb_lastclosetime',%@)",timeStampStr,timeStampStr];
[self stringByEvaluatingJavaScriptFromString:jsStr];
}
果然,最后再次加载百度再也看不到烦人的百度APP推荐了