iOS9開發--(Content Blocker)Safari廣告攔截詳解
前言:
iOS9推出已經有一個多月了,想必各位開發者對iOS9的一些新特性,iOS的適配等方面已經都有所瞭解,在日常使用中也積累了一定的經驗和心得。 Content Blocker這個iOS9中推出的新外掛,你一定聽說過吧,有了它,safari可以輕鬆的遮蔽掉頁面上的廣告,讓我們的上網更加的方便,愉快。 在iOS9推出的這一個多月來,各路開發者已經開發了無數款基於content blocker外掛的app,賺得盆滿鉢滿,如果你也想自己開發一個content blocker,那麼請注意了,今天我們就來講一講怎麼樣開發一款content blocker外掛的app。首先我們來看下沒有使用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
trigger定義了規則啟用的條件。當trigger中的條件達到時,規則就被啟用,action中的操作就將執行。目前,trigger中跟著資源載入相關的資訊,例如,url和網頁資源resource的型別,document的domain,資源resource和document的關係,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網站上圖片的遮蔽
extension建立後,預設的extension中自帶有一條規則,上面我們已經列出來了,現在來解讀一下 action type:block表示我們將使用block方法來進行遮蔽 trigger中使用的是url-filter,直接進行資源的匹配,匹配的是webkit.org/images/icon-gold.png這張圖片資源 我們執行demo,然後在設定中開啟Safari的content blocker開啟Safari,然後開啟webkit.org,然後在mac的Safari的Develop選單中選擇simulator--Safari www.webkit.org,這樣就可以開啟Safari的Web inspector (如果是真機測試,那麼首先要在設定的Safari--高階中開啟web檢查器),Mac上面如果沒有Develop選項的話開啟Safari的preference,選擇高階,把最下面的顯示develop按鈕勾上。 v
接下來,我們就可以利用web inspecor來進行資源或者css元素的檢視
在resource中我們可以看到icon-gold.png這個檔案,在Safari網頁中可以看到,這個顯示在標題左邊的
現在,我們啟動demo,看看這種圖片是否被遮蔽了
很明顯的,標題邊上的icon被遮蔽了,說明block規則是生效的,下面,我們想把download那個圖示也給遮蔽掉,該怎麼操作呢,同樣,在web inspector找到圖示的名稱,download.png,在json檔案中新增一條block這個圖示的規則,新增後的json檔案如下:
[
{
"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?
同樣,我們可以利用web inspector來進行篩選。手機上的Safari開啟baidu.com並且搜尋科魯茲,然後在Mac的Safari中單擊Develop中選擇simulator或者真機xxx的iPhone,選中開啟的網頁,然後彈出web inspector,選擇element標籤,通過點選不同的節點可以定位到網頁中的廣告,如圖
根據css選擇器的規則,可以知道selector中的內容應該是"selector":"div.ec_wise_ad",CSS選擇器語法在這裡可以看到:http://www.w3school.com.cn/cssref/css_selectors.asp,相信看過這個,css選擇器該怎麼操作,應該很有把握了。
通過這兩個例子,你應該掌握了content blocker的基本用法了吧,關於ActionRequestHandler這個類的作用,extension與containing app的通訊,留待下一篇吧。如果有什麼問題或者疑問,歡迎評論或指正。