前言:
首先我们来看下没有使用content blocker时,Safari用百度搜索时的情况,如下图
前面两个显示出来的词条都是属于广告词条,这个就是content blocker需要处理的东西
使用 content blocker后的搜索结果:
很明显的看到,前面两个广告词条被屏蔽掉了。
那么,这是如何做到的呢?
创建Extension
我们用一个demo来说明一下这个过程
首先创建一个工程,接着,在工程中创建一个Extension,如图
点击左下角,添加target
选择Application Extension -- Content Blocker Extension
工程中出现如下文件夹,说明创建成功,创建成功后,系统会自动生成blockerList.json的文件,这个文件就是屏蔽广告的核心文件,通过这个文件,我们可以自定义屏蔽规则,下面会重点介绍这个文件。
ActionRequstHandler类: 这个类可以帮助我们对extension和containing app(也就是我们这个ContentBlockerDemo这个app)进行一些通信,数据的交互等等。
extension创建后,运行这个工程,其实就已经实现了content blocker插件的功能了,什么?这么简单,确实就是这么简单,但是,注意,这里只是实现了content blocker的功能,但是屏蔽的规则,也就是blockerList.json这个文件,我们其实是没有进行过任何改动的,而这个文件,决定了我们可以屏蔽什么,因此,现在的demo具备了屏蔽的功能,但是是否可以屏蔽内容还取决于规则文件中的内容。接下来,我们就来看看这个json的规则文件到底是什么。
我们打开blockerList.json文件,里面的内容是这样的
[
{
"action": {
"type": "block"
},
"trigger": {
"url-filter": "webkit.org/images/icon-gold.png"
}
}
]
一条典型的规则就是由action 和 trigger组成的,下面我们分别来说说这两个参数
Trigger
- url-filter(字符串,必须)匹配资源的url(注意这里是资源,包括图片,媒体文件,js文件等等都包含在内)
- url-filter-is-case-sensitive(boolean类型,可选)url-filter中的内容是否区分大小写
- resource-type (string数组,可选)
- load-type(string数组,可选)
- if-domain(string数组,可选)
Action
action指定了一旦trigger匹配成功了某些资源后该采取什么样的行动,一般有如下两个有效的参数
- type (字符串,必须):定义了当规则激活后做什么,目前有三种类型的type可以用来处理资源的:block,block-cookies,css-display-none,其实还有一种(ignore-previous-rules),这个是用来控制content blocker的行为的,跟资源屏蔽没有关系
- selector(字符串,当type类型是css-display-none时必须添加selector参数)定义了匹配页面上元素的selector列表,类似css选择器
[
{
"trigger": {
…
},
"action": {
…
}
},
{
"trigger": {
…
},
"action": {
…
}
}
]
示例一:webkit网站上图片的屏蔽







[
{
"action": {
"type": "block"
},
"trigger": {
"url-filter": "webkit.org/images/icon-gold.png"
}
},
{
"action": {
"type": "block"
},
"trigger": {
"url-filter": "webkit.org/images/download.png"
}
]
示例二:
这个例子是通过block来屏蔽资源达到屏蔽广告的目的,下面,我们来通过css-display-none结合selector来屏蔽广告,效果图就是文章开头百度的例子,它的规则是怎么样的呢 {
"action": {
"type": "css-display-none",
"selector": "div.ec_wise_ad"
},
"trigger": {
"url-filter": "baidu.com"
}
}
为什么selector是div.ec_wise_ad?

根据css选择器的规则,可以知道selector中的内容应该是"selector":"div.ec_wise_ad",CSS选择器语法在这里可以看到:http://www.w3school.com.cn/cssref/css_selectors.asp,相信看过这个,css选择器该怎么操作,应该很有把握了。
通过这两个例子,你应该掌握了content blocker的基本用法了吧,关于ActionRequestHandler这个类的作用,extension与containing app的通信,留待下一篇吧。如果有什么问题或者疑问,欢迎评论或指正。