WKWebView強大的新特性


iOS11對WKWebView的功能進一步完善,新增如下功能:

  1. Manager Cookies
  2. Fileter unwanted content
  3. Provide custom resources

下面是對各個特性的簡單介紹,詳細可參見源碼

1.Manager Cookies

iOS11新增了一個類來專門管理Cookies:WKHTTPCookieStore。它主要包含了了對Cookie的操作:刪除、添加、獲取等。
比如這種場景:
一個頁面默認登錄,當我沒有登錄的時候會彈出輸入框,輸入賬號。輸入完成之后,會提示已登錄。再次打開該頁面時,頁面會先判斷有沒有cookie,有cookie直接提示已登錄,沒有cookie則再次彈框讓用戶登錄。
但是現在有個新需求:第一次安裝APP,啟動的時候就有個默認的賬戶登錄,而不需要彈框輸入。這就用到了cookie的添加。在APP將要加載webView之前,通過HTTPCookie來初始化一個實例,將其塞到webView的configuration的數據存儲中。這樣加載WebView時就已經有cookie存在了。這樣就打熬了首次默認登錄的效果。關鍵代碼如下:

let cookie = HTTPCookie.init(properties: [
            .domain:"172.16.10.26",
            .path:"/src/p/index/index.html",
            .version:0,
            .expires:Date.init(timeIntervalSinceNow: 30*60*60),
            .name:"username",
            .value:"zhanggui33"
            ])
            
let cookieStore = myWKWebView.configuration.websiteDataStore.httpCookieStore
        
cookieStore.setCookie(cookie!) {
            
            self.myWKWebView.load(URLRequest.init(url: URL.init(string: "http://172.16.10.26:3333/src/p/index/index.html")!))
        }
        

也就是在加載網頁前,將cookie注入。更多可參見這里源代碼

2.Fileter unwanted content

另外一個新特性就是過濾你不想要的內容。比如說你在app中加載的網頁中包含http請求,你可以根據以下規則將http資源加載之前轉換成https加載。這個是蘋果官方演示的一個規則:

let jsonString = """
            [{
                "trigger":{
                    "url-filter": ".*"
                },
                "action":{
                    "type": "make-https"
                }

            }]
            """

這里主要用到了WKContentRuleListStore。下面就來詳細對其進行介紹。

創建一個Trigger字典

一個trigger的字典必須要包含url-filter這個key,它指定了匹配url的模式。其他的就是可選的了,例如你可以限制指定的域名,讓該域名的內容不加載。例如下面的這個trigger規則,制定了用於圖片和樣式資源的規則trigger,不包含某寫域名上的:

"trigger": {
        "url-filter": ".*",
        "resource-type": ["image", "style-sheet"],
        "unless-domain": ["your-content-server.com", "trusted-content-server.com"]
}

除了上面提到的trigger key,還有url-filter-is-case-sensitive、is-domain、unless-domain、resource-type等。具體的詳細介紹可以參見官方解釋

創建一個Action字典

當trigger匹配到了符合條件的資源,瀏覽器便會執行與trigger相關聯的操作。當所有的trigger都被評估后,action便會按照順序執行。
Action只有兩個key:type和selector。type是必須要有的,selector可選,如果type是css-display-none,那么selector也是必須要有的。其他的type中selector是可選的。
type的類型有:block、block-cookies、css-display-none、ignore-previous-rules、make-https。更多可以參見官方解釋
例如我想屏蔽頁面中所有圖片的加載:

 //把所有的圖片阻塞加載
        let jsonString = """
            [{
                "trigger":{
                    "url-filter": ".*",
                    "resource-type":["image"]
                },
                "action":{
                    "type":"block"
                }
            }]
            """
        WKContentRuleListStore.default().compileContentRuleList(forIdentifier: "demoRuleList", encodedContentRuleList: jsonString) { (list, error) in
            guard let contentRuleList = list else { return }
            let configuration = self.filterWebView.configuration
            configuration.userContentController.add(contentRuleList)
            self.filterWebView.load(URLRequest.init(url: URL.init(string: "http://m.baidu.com")!))
        }

更多詞義的解釋還是看官方文檔,里面介紹的很詳細。

3.Provide custom resources

這個特性允許你提供自定義的資源,這也可以實現離線緩存。例如你把所有的圖片都放到app里面,然后網頁加載圖片時按照特定的scheme(比如:wk-feature://cat)來加載,然后在客戶端代碼中使用特定的SchemeHandler來解析即可。這里主要用到了WKURLSchemeHandler和WKURLSchemeTask。
關鍵代碼如下:

    
        let configuration = WKWebViewConfiguration()
        let schemeHandler = MyCustomSchemeHandler.init(viewController: self)
        
        configuration.setURLSchemeHandler(schemeHandler, forURLScheme: "wk-feature")

實現了自己的SchemeHandler,然后對特定的Scheme進行處理。

總結

如果你還在使用UIWebView,那么趕快更換為WKWebView吧。畢竟蘋果更傾向於WKWebView。不斷地將其功能豐富。而且經過了幾個版本迭代,使用WKWebView的坑也都逐漸填平。

附源碼

1.WKWebViewNewFeature

參考

  1. Customized Loading in WKWebView
  2. Introduction to Safari Content-Blocking Rules

轉載請注明來源:http://www.cnblogs.com/zhanggui/p/8260136.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM