WKWebView强大的新特征

iOS11对WKWebView的效应进一步健全,新增如下效果:

iOS11对WKWebView的效能越来越完善,新增如下效果:

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

上边是对一一个性的简单介绍,详细可参见源码

下边是对各特性格的简易介绍,详细可参见源码

1.Manager Cookies

iOS11猛增了叁个类来专门管理Cookies:WKHTTPCookieStore。它首要涵盖了了对Cookie的操作:删除、添加、获取等。
譬如说那种现象:
2个页面默许登录,当本身尚未登录的时候会弹出输入框,输入账号。输入完结之后,会唤起已报到。再度打开该页面时,页面会先判断有没有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注入。更多可参见这里源代码

1.Manager Cookies

iOS11激增了二个类来专门管理Cookies:WKHTTPCookieStore。它至关首要含有了了对Cookie的操作:删除、添加、获取等。
比如说那种气象:
贰个页面暗许登录,当小编从没登录的时候会弹出输入框,输入账号。输入完结现在,会唤醒已登录。再一次打开该页面时,页面会先判断有没有cookie,有cookie直接提醒已登录,没有cookie则再度弹框让用户登录。
然而未来有个新要求:第②回安装APP,运行的时候就有个暗许的账户登录,而不要求弹框输入。这就用到了cookie的增加。在APP将要加载webView在此以前,通过HTTP库克ie来早先化四个实例,将其塞到webView的configuration的数量存款和储蓄中。那样加载WebView时就已经有cookie存在了。那样就打熬了第3次私下认可登录的效劳。关键代码如下:

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加载。那一个是苹果官方演示的2个规则:

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

            }]
            """

此处首要使用了WKContentRuleListStore。上边就来详细对其进展介绍。

2.Fileter unwanted content

除此以外二个新特点正是过滤你不想要的内容。比如说你在app中加载的网页中涵盖http请求,你能够根据以下规则将http能源加载从前转换来https加载。那个是苹果官方演示的2个规则:

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等。具体的详实介绍能够参见合法表达

创办七个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")!))
        }

越多词义的诠释依然看法定文书档案,里面介绍的很详细。

创制多少个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来分析即可。那里最首要利用了WKUMuranoLSchemeHandler和WKU福睿斯LSchemeTask。
重在代码如下:

        let configuration = WKWebViewConfiguration()
        let schemeHandler = MyCustomSchemeHandler.init(viewController: self)

        configuration.setURLSchemeHandler(schemeHandler, forURLScheme: "wk-feature")

金镶玉裹福禄双全了投机的SchemeHandler,然后对特定的Scheme进行处理。

3.Provide custom resources

其一性格允许你提供自定义的财富,这也能够兑现离线缓存。例如你把持有的图纸都放置app里面,然后网页加载图片时遵照一定的scheme(比如:wk-feature://cat)来加载,然后在客户端代码中利用一定的SchemeHandler来分析即可。这里最重要采用了WKU路虎极光LSchemeHandler和WKU帕杰罗LSchemeTask。
最主要代码如下:

        let configuration = WKWebViewConfiguration()
        let schemeHandler = MyCustomSchemeHandler.init(viewController: self)

        configuration.setURLSchemeHandler(schemeHandler, forURLScheme: "wk-feature")

完结了和睦的SchemeHandler,然后对一定的Scheme进行处理。

总结

如果您还在行使UIWebView,那么尽快更换为WKWebView吧。究竟苹果更赞成于WKWebView。不断地将其功效丰裕。而且经过了多少个本子迭代,使用WKWebView的坑也都渐渐填平。

总结

即便您还在行使UIWebView,那么尽快更换为WKWebView吧。毕竟苹果更赞成于WKWebView。不断地将其作用丰盛。而且经过了多少个版本迭代,使用WKWebView的坑也都慢慢填平。

附源码

1.WKWebViewNewFeature

附源码

1.WKWebViewNewFeature

参考

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

转载请表明来源:http://www.cnblogs.com/zhanggui/p/8260136.html

参考

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

转发请表明来源:http://www.cnblogs.com/zhanggui/p/8260136.html

相关文章