浅谈UIWebView与WKWebView
1.什么是WebView?WebView是一个基于webkit引擎、展现web页面的内嵌浏览器控件,我们可以用它来浏览网页、打开文档等;
在iOS中主要有两种WebView:UIWebView和WKWebView。2008年首次发布ios2,UIWebView诞生, 2014年发布ios8,WKWebView是在iOS8开始使用,WKWebView和UIWebView的本质是一样的,但WKWebView在UIWebView的基础之上做了优化,可以理解为WKWebView是UIWebView的升级版。
UIWebView对内存消耗大,流量消耗大,无法调用系统文件,硬件资源等。WKWebView内存占用是UIWebView的1/4~1/3 ,页面渲染效率高。
2.WebView加载方式有两种,一种通过输入URL或本地文件路径加载内容,一种通过一段HTML原代码赋给UIWebView来加载(若想在HTML上加js、css需要另外写代码)。
3.在QQmail业务中许多地方分别使用到了UIWebView和WKWebView。
在2011年,QQ邮箱ios端采用UIWebView技术开发读写信的邮件内容部分,邮件内容的本质是一段html,读信时邮件内容的加载方式是打开下载到本地数据库的html,写信则是加载本地的html。记事本的内容预览及编辑同样使用UIWebView来加载html。
邮件内容的预览及编辑使用UIWebView在当时已是较好的选择,过了两三年WKWebView诞生,此时读写邮件内容已经相对稳定和成熟,涉及的细节非常复杂,修改成WKWebView改动大,所需成本高,因此读写邮件内容就一直保留了UIWebView。
邮件的附件预览也是使用webview技术实现,word文档、excel文档的预览是优先使用WKWebView技术,txt及html格式的文件仍是使用UIWebView,txt与html保留使用UIWebView,是因为这两种格式的文件使用WKWebView时与使用UIWebView,编码格式更容易出现乱码。
至于读写信没有将整个界面直接做成WebView形式,是因为头部的输入框不好用UIWebView做效果,权衡之后选择了只将邮件内容部分做成WebView。下面为 UIWebView调用本地html文件例子(不是实际使用的业务代码,只是模板):
- (void)simpleExampleTest {
//1.创建文件路径
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"readmail" ofType:@"html"];
// 2.设置html
NSString *htmlString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]
//3. 加载html
[myWebView loadHTMLString:htmlString baseURL:[NSURL URLWithString:filePath]];
}
读信的邮件内容中打开url链接的方式是两年前改做WKWebView,应用中的读书功能同样用WKWebView调用url的方式,选择WKWebView是因为他的页面渲染效率高,打开页面更快,用户体验更好。下面为WKWebView 调用URL的例子(不是实际使用的业务代码,只是模板):
//导入WebKit
import
- (void)simpleExampleTest {
// 1.创建webview,并设置大小,"20"为状态栏高度
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
// 2.创建请求
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@" https://mail.qq.com "]];
// 3.加载网页
[webView loadRequest:request];
// 4.最后将webView添加到界面
[self.view addSubview:webView];
}
4.在线文档以前是使用WKWebView,现修改为是由UIWebView调用url的形式实现, UIWebView 跟 WKWebView都可以支持js api的,js api是用来ios原生跟H5做交互的 之所以要换成WKWebView 的话 是 为了做在线文档的离线包机制、离线预览跟离线编辑功能,要支持这些功能必须要代理截获webView的http请求,UIWebView 跟 WKWebView都可以截获代理它发出的http请求,但是使用WKWebView来截获代理请求的话,会影响不那些不需要代理的请求,会使那些不代理的http请求丢失掉头部或请求body等信息