在ios11中拉馋,WKWebview增加了三個API對應(yīng)三個新特性:
?WKHTTPCookieStore:管理cookie
WKContentRuleList:過濾掉不想要的內(nèi)容
WKURLSchemeHandler:用于處理自定義的 URL Scheme
WKHTTPCookieStore:
開發(fā)者可以添加或移除某一個cookie踩晶;可以獲取一個WKWebView實(shí)例里所有的cookie么介。
??1.首先從實(shí)例里獲取一個cookieStore:
open class WKWebsiteDataStore : NSObject, NSCoding {
? ? open var httpCookieStore: WKHTTPCookieStore { get }
}
let cookieStore = webView.configuration.websiteDataStore.httpCookieStore;
2.添加一個cookie:
let cookie = HTTPCookie(properties: [
? ? HTTPCookiePropertyKey.domain: "canineschool.org",
? ? HTTPCookiePropertyKey.path: "/",
? ? HTTPCookiePropertyKey.secure: true,
? ? HTTPCookiePropertyKey.name: "LoginSessionID",
? ? HTTPCookiePropertyKey.value: "5bd9d8cabc46041579a311230539b8d1"])
cookieStore.setCookie(cookie!) {
? ? webView.load(loggedInURLRequest)
}
3.獲取實(shí)例里所有的cookie:
cookieStore.getAllCookies() { (cookies) in
? ? for cookie in cookies {
? ? // Find the login cookie
? ? }
}
4.刪除一個cookie:
cookieStore.delete(cookie!) {
? ? webView.load(loggedOutURLRequest)?
}
WKContentRuleList:
內(nèi)容過濾器床未,基于在ios9中新增的Content Blocker功能烫映,將他應(yīng)用在了WKWebView中袱衷,可實(shí)現(xiàn)屏蔽符合自定義過濾規(guī)則的資源內(nèi)容检吆,屏蔽cookie酣藻,將http轉(zhuǎn)換為https等曹洽。
WebKit在編譯這些規(guī)則時(shí)使用的是比較高效的bytecode。
1.?json格式的過濾規(guī)則示例(將連接轉(zhuǎn)換為https):
[{
? ? "trigger": {
? ? ? ? "url-filter": ".*"
? ? },
? ? "action": {
? ? ? ? "type": "make-https"
? ? }
}]
2.編譯這個規(guī)則:
let jsonString = loadJSONFromBundle()
WKContentRuleListStore.default().compileContentRuleList(
? ? forIdentifier: "ContentBlockingRules",
? ? encodedContentRuleList: jsonString) { (contentRuleList, error) in
? ? if let error = error {
? ? ? ? return
? ? }
? ?createWebViewWithContentRuleList(ruleList!)
}
3.進(jìn)入這個預(yù)先編譯好的過濾規(guī)則:
WKContentRuleListStore.default().lookUpContentRuleList(forIdentifier: "ContentBlockingRules") {
? ? (contentRuleList, error) in
? ? // Use previously compiled content rule list
}
4.將規(guī)則應(yīng)用到某個WKWebView實(shí)例:
let configuration = WKWebViewConfiguration()
configuration.userContentController.add(contentRuleList)
WKURLSchemeHandler:
可以給你指定的某些Scheme辽剧,如https送淆,file,mailto添加一些handler語句抖仅,在請求這些scheme時(shí)加一些自己的處理內(nèi)容坊夫。
有一個Scheme作為蘋果的預(yù)留,你不能使用:"local"撤卢,建議改為"apple-local"之類的环凿。
1.自定義一個handler,包含加載URL開始跟結(jié)束的回調(diào):
class MyCustomSchemeHandler : NSObject, WKURLSchemeHandler {
? ?func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
? ? }
? ?func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {
? ? }
}
2.為WK的實(shí)例設(shè)置這個handler:
let configuration = WKWebViewConfiguration()
configuration.setURLSchemeHandler(MyCustomSchemeHandler(), forURLScheme: “apple-local”)
3.在開始回調(diào)里指定需要的數(shù)據(jù):
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
? ? let resourceData = createHTMLResourceData()
? ? let response = URLResponse(
? ? ? ? url: urlSchemeTask.request.url!,
? ? ? ? mimeType: “text/html”,
? ? ? ? expectedContentLength: resourceData.count,
? ? ? ? textEncodingName: nil)
}
4.將數(shù)據(jù)返回:
func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
? ? let resourceData = createHTMLResourceData()
? ? let response = ...
? ? urlSchemeTask.didReceive(response)
? ? urlSchemeTask.didReceive(resourceData)
? ? urlSchemeTask.didFinish()
}