iOS11對WKWebView的功能進一步完善,新增如下功能: ...
iOS11對WKWebView的功能進一步完善,新增如下功能:
- Manager Cookies
- Fileter unwanted content
- 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的坑也都逐漸填平。
附源碼
參考
轉載請註明來源:http://www.cnblogs.com/zhanggui/p/8260136.html