WWDC 2017中WKWebView的新特性

在ios11中,WKWebview增加了三个API对应三个新特性:

WKHTTPCookieStore:管理cookie

WKContentRuleList:过滤掉不想要的内容

WKURLSchemeHandler:用于处理自定义的 URL Scheme


WKHTTPCookieStore:

开发者可以添加或移除某一个cookie;可以获取一个WKWebView实例里所有的cookie。

​​1.首先从实例里获取一个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.获取实例里所有的cookie:

cookieStore.getAllCookies() { (cookies) in

    for cookie in cookies {

    // Find the login cookie

    }

}

4.删除一个cookie:

cookieStore.delete(cookie!) {

    webView.load(loggedOutURLRequest) 

}


WKContentRuleList:

内容过滤器,基于在ios9中新增的Content Blocker功能,将他应用在了WKWebView中,可实现屏蔽符合自定义过滤规则的资源内容,屏蔽cookie,将http转换为https等。

WebKit在编译这些规则时使用的是比较高效的bytecode。

1.​json格式的过滤规则示例(将连接转换为https):

[{

    "trigger": {

        "url-filter": ".*"

    },

    "action": {

        "type": "make-https"

    }

}]

2.编译这个规则:

let jsonString = loadJSONFromBundle()

WKContentRuleListStore.default().compileContentRuleList(

    forIdentifier: "ContentBlockingRules",

    encodedContentRuleList: jsonString) { (contentRuleList, error) in

    if let error = error {

        return

    }

   createWebViewWithContentRuleList(ruleList!)

}

3.进入这个预先编译好的过滤规则:

WKContentRuleListStore.default().lookUpContentRuleList(forIdentifier: "ContentBlockingRules") {

    (contentRuleList, error) in

    // Use previously compiled content rule list

}

4.将规则应用到某个WKWebView实例:

let configuration = WKWebViewConfiguration()

configuration.userContentController.add(contentRuleList)


WKURLSchemeHandler:

可以给你指定的某些Scheme,如https,file,mailto添加一些handler语句,在请求这些scheme时加一些自己的处理内容。

有一个Scheme作为苹果的预留,你不能使用:"local",建议改为"apple-local"之类的。

1.自定义一个handler,包含加载URL开始跟结束的回调:

class MyCustomSchemeHandler : NSObject, WKURLSchemeHandler {

   func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {

    }

   func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {

    }

}

2.为WK的实例设置这个handler:

let configuration = WKWebViewConfiguration()

configuration.setURLSchemeHandler(MyCustomSchemeHandler(), forURLScheme: “apple-local”)

3.在开始回调里指定需要的数据:

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.将数据返回:

func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {

    let resourceData = createHTMLResourceData()

    let response = ...

    urlSchemeTask.didReceive(response)

    urlSchemeTask.didReceive(resourceData)

    urlSchemeTask.didFinish()

}

视频:https://developer.apple.com/videos/play/wwdc2017/220/

你可能感兴趣的:(WWDC 2017中WKWebView的新特性)