我猜很多人已经注意到,在 iOS 9 正式版发布之后,应用商店上开始大量出现广告拦截应用,本文就和小伙伴们一起来了解一下苹果新推出的内容拦截功能—— Content Blocker。
关于其他 iOS 9 的特性与功能,有兴趣的朋友可以参考我博客中的 iOS 9 适配系列。
准备工作
新建项目之后,要使用 Content Blocker 需要新建一个 Target,依次选择菜单 File
=> New
=> Target...
,然后在新建面板中选择 iOS
=> Application Extension
=> Content Blocker Extension
,然后点击 Next 并填写相关内容即可,本文使用 Swift 做说明。
如果出现 Activate "Target名称" scheme
提示,选择 Activate
即可,你也可以顺便勾选不再提示(Do not show this message again
)的选项。
拦截规则
创建好 Target 后,除了 ActionRequestHandler.swift
之外,机智的小伙伴们一定已经看到刚才一个名为 blockerList.json
的 JSON 文件,事实上 Content Blocker 的基本原理,正是通过 ActionRequestHandler.swift
中的代码将这个 blockerList.json
嵌入 Safari。
文件 ActionRequestHandler.swift
中的代码是这样的:
import UIKit
import MobileCoreServices
class ActionRequestHandler: NSObject, NSExtensionRequestHandling {
func beginRequestWithExtensionContext(context: NSExtensionContext) {
let attachment = NSItemProvider(contentsOfURL: NSBundle.mainBundle().URLForResource("blockerList", withExtension: "json"))!
let item = NSExtensionItem()
item.attachments = [attachment]
context.completeRequestReturningItems([item], completionHandler: nil);
}
}
那么,我们接下来就来了解一下 blockerList.json
中内容的编写规则。要了解这些规则,首先来观察一下 Xcode 自动生成的代码:
[
{
"action": {
"type": "block"
},
"trigger": {
"url-filter": "webkit.org/images/icon-gold.png"
}
}
]
很显然,这段 JSON 代码中提供了一组 action
与 trigger
来构成一条规则。其中:
-
action
: 表示该条规则的拦截方式,其type
可以为:-
block
: 拦截资源文件,如CSS文件、JS文件、图片资源等 -
block-cookies
: 拦截cookies -
css-display-none
: 将指定 HTML 元素的 CSS 样式的display
属性设置为none
),这些 HTML 元素通过在action
中加入selector
(CSS Selector) 键值对来指定,关于CSS Selector
的相关内容请自行百度
-
-
triggerr
: 表示该条规则适用的 URL,允许使用正规表达式(RegEx),关于正则表达式的语法请参考我之前的博客 RegEx Syntax
现在我们就能理解这些预置 JSON 代码的作用,即拦截 webkit.org/images/icon-gold.png
文件的加载。
最后,请记住要在 iDevice 中的设置
应用中选择 Safari
=> Content Blockers
并启用你的插件(如果已经启用,你也可能需要关闭后重新启用)。