1. 程式人生 > >iOS9開發--(Content Blocker)Safari廣告攔截詳解

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陣列,可選)
上面幾個引數中,最重要的就是url-filter,它是必選的引數,一般,我們使用這個引數就可以達到目的了,下面的幾個可以搭配使用,這裡不一一介紹。url-filter可以使用萬用字元來進行匹配,特殊符號使用//來進行轉義,可以精確匹配,也可以進行模糊匹配,這取決於我們的使用場景。後面會通過例子來說明。

Action

action指定了一旦trigger匹配成功了某些資源後該採取什麼樣的行動,一般有如下兩個有效的引數

  • type  (字串,必須):定義了當規則啟用後做什麼,目前有三種類型的type可以用來處理資源的:block,block-cookies,css-display-none,其實還有一種(ignore-previous-rules),這個是用來控制content blocker的行為的,跟資源遮蔽沒有關係
  • selector(字串,當type型別是css-display-none時必須新增selector引數)定義了匹配頁面上元素的selector列表,類似css選擇器
block:最強大的一種遮蔽廣告的方式,它通知外掛,不要載入trigger中匹配成功的資源,從源頭上杜絕了廣告,並且從某種意義上來說,加快了網頁的載入速度,並且節省了流量,所以,我們一般優先使用block方式來進行廣告的遮蔽; block-cookies:Safari在contentblocker這套規則之上有自己的一套隱私策略,開發者只能在這個基礎之上進行cookies的遮蔽,使用block-cookies和ignore-previous-rules的組合仍然遵循Safari的隱私設定。 css-display-none:通過對css元素的控制來達到遮蔽廣告的效果,將trigger匹配到的css元素進行隱藏操作,從而達到遮蔽廣告的作用。css-display-none要通過和selector的組合來使用,selector匹配頁面中的css元素。 blockerList.json中一般包含多條規則,一個典型的規則檔案類似於下面的格式,不同的規則之間用“,”隔開,一個大的規則檔案,甚至可以包含上下條規則,當然,這個檔案並不是可以無限大的,實際使用中我們檔案一旦大到數10M後,會出現無法讀取規則的現象,不知道這個是不是個例。
  [
        {
            "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的通訊,留待下一篇吧。如果有什麼問題或者疑問,歡迎評論或指正。