iOS UIWebView 与 WKWebView

前言:
开发场景中,我们总是会遇到需要跟web端人员配合实现 原生加载网页并处理交互的情况。在 iOS 7.0 之前 加载网页一般是用 uiwebView 控件,iOS 8.0 推出了一款新的加载控件 WKWebView。

WKWebView 的优势:
1:以前在使用 UIWebView 时总是会遇到 系统内存持续增大,甚至webView 释放掉后内存也无法恢复等问题,而WKWebView 的跨进程方案和高达 60fps 的刷新率大大提升了 网页加载的性能和速度
2:WKWebView 的进程更细致,在数据请求前和加载前都会询问用户是否允许操作继续进行。


1982284-596dde3f16d002a6.png
8956555-63904638c3e77d4e.png

3:使用方式更清晰,WKWebView 主要 通过两个协议:WKNavigationDelegate, WKUIDelegate 和几个类 :WKWebView,WKWebViewConfiguration,WKUserScript,WKUserContentController,WKWebsiteDataStore 构建控件,使用时更能提高代码可读性。

4:与JS交互更简便优雅,在UIWebView 时,我们需要 导入苹果自带的 库 JavaScriptCore 或者使用第三方库 :WebViewJavascriptBridge,代码沉重使用也较复杂, 而WKWebView 中自带的 WKUserContentController 即为 原生与JS交互的桥梁,可通过设置其相关属性和协议 直接完成与 JS 的交互。

5:WKWebView 自带 加载进度属性,便于我们直接绘制进度条。

WKWebView 存在的问题:
cookie问题:由于WKWebView 加载 网页 是异步的,会导致 cookie 丢失问题。传统模式由 NSHTTPCookieStorage 统一管理 cookie,写入和请求时能同步, WKWebView 中由单独的 WKWebsiteDataStore 独自管理cookie(iOS 11后)。 我们也可以 将Cookie 存起来,每次准备发起请求的时候进行判断,给没有Cookie 的请求添加上Cookie 再去访问。

跨域问题:
什么是跨域:网页跳转时 只要 前后网页的 协议,域名,端口 有任何一处不相同,都被称为跨域访问。
在 WKWebView 中由于考虑到安全问题,在HTTP 想载入 HTTPS 跨域链接时会被 WKWebView 拦截。 可以跟后端开发人员协商 接口配置允许支持 跨域。或者 在请求发起时拦截并判断是否跨域,如果是则调用 UIApplication.shared.open(<#T##url: URL##URL#>, options: <#T##[UIApplication.OpenExternalURLOptionsKey : Any]#>, completionHandler: <#T##((Bool) -> Void)?##((Bool) -> Void)?##(Bool) -> Void#>) 来对跨域链接做单独处理.

参考链接:
https://www.jianshu.com/p/f4f91abb5df9
https://www.jianshu.com/p/833448c30d70

猜你喜欢

转载自blog.csdn.net/weixin_33827965/article/details/86928483