淺談UIWebView與WKWebView
1.什么是WebView?WebView是一個(gè)基于webkit引擎、展現(xiàn)web頁面的內(nèi)嵌瀏覽器控件宵呛,我們可以用它來瀏覽網(wǎng)頁、打開文檔等夕凝;
在iOS中主要有兩種WebView:UIWebView和WKWebView宝穗。2008年首次發(fā)布ios2,UIWebView誕生, 2014年發(fā)布ios8,WKWebView是在iOS8開始使用码秉,WKWebView和UIWebView的本質(zhì)是一樣的逮矛,但WKWebView在UIWebView的基礎(chǔ)之上做了優(yōu)化,可以理解為WKWebView是UIWebView的升級(jí)版转砖。
UIWebView對(duì)內(nèi)存消耗大须鼎,流量消耗大,無法調(diào)用系統(tǒng)文件府蔗,硬件資源等晋控。WKWebView內(nèi)存占用是UIWebView的1/4~1/3 ,頁面渲染效率高姓赤。
2.WebView加載方式有兩種糖荒,一種通過輸入U(xiǎn)RL或本地文件路徑加載內(nèi)容,一種通過一段HTML原代碼賦給UIWebView來加載(若想在HTML上加js模捂、css需要另外寫代碼)捶朵。
3.在QQmail業(yè)務(wù)中許多地方分別使用到了UIWebView和WKWebView。
在2011年狂男,QQ郵箱ios端采用UIWebView技術(shù)開發(fā)讀寫信的郵件內(nèi)容部分综看,郵件內(nèi)容的本質(zhì)是一段html,讀信時(shí)郵件內(nèi)容的加載方式是打開下載到本地?cái)?shù)據(jù)庫的html,寫信則是加載本地的html岖食。記事本的內(nèi)容預(yù)覽及編輯同樣使用UIWebView來加載html红碑。
郵件內(nèi)容的預(yù)覽及編輯使用UIWebView在當(dāng)時(shí)已是較好的選擇,過了兩三年WKWebView誕生泡垃,此時(shí)讀寫郵件內(nèi)容已經(jīng)相對(duì)穩(wěn)定和成熟析珊,涉及的細(xì)節(jié)非常復(fù)雜,修改成WKWebView改動(dòng)大蔑穴,所需成本高忠寻,因此讀寫郵件內(nèi)容就一直保留了UIWebView。
郵件的附件預(yù)覽也是使用webview技術(shù)實(shí)現(xiàn)存和,word文檔奕剃、excel文檔的預(yù)覽是優(yōu)先使用WKWebView技術(shù)衷旅,txt及html格式的文件仍是使用UIWebView,txt與html保留使用UIWebView,是因?yàn)檫@兩種格式的文件使用WKWebView時(shí)與使用UIWebView纵朋,編碼格式更容易出現(xiàn)亂碼柿顶。
至于讀寫信沒有將整個(gè)界面直接做成WebView形式,是因?yàn)轭^部的輸入框不好用UIWebView做效果操软,權(quán)衡之后選擇了只將郵件內(nèi)容部分做成WebView嘁锯。下面為 UIWebView調(diào)用本地html文件例子(不是實(shí)際使用的業(yè)務(wù)代碼,只是模板):
- (void)simpleExampleTest {
<pre style="margin-top:7.5pt;margin-right:0cm;margin-bottom:7.5pt;margin-left:
0cm;line-height:21.75pt;background:white"> //1.創(chuàng)建文件路徑</pre>
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"readmail" ofType:@"html"];
// 2.設(shè)置html
NSString *htmlString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]
//3. 加載html
[myWebView loadHTMLString:htmlString baseURL:[NSURL URLWithString:filePath]];
}
讀信的郵件內(nèi)容中打開url鏈接的方式是兩年前改做WKWebView,應(yīng)用中的讀書功能同樣用WKWebView調(diào)用url的方式聂薪,選擇WKWebView是因?yàn)樗?a href="http://www.reibang.com/p/7aba76d871a6" target="_blank">頁面渲染效率高猪钮,打開頁面更快,用戶體驗(yàn)更好胆建。下面為WKWebView 調(diào)用URL的例子(不是實(shí)際使用的業(yè)務(wù)代碼烤低,只是模板):
//導(dǎo)入WebKit
import <WebKit/WebKit.h>
- (void)simpleExampleTest {
// 1.創(chuàng)建webview,并設(shè)置大小笆载,"20"為狀態(tài)欄高度
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
// 2.創(chuàng)建請(qǐng)求
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@" https://mail.qq.com "]];
// 3.加載網(wǎng)頁
[webView loadRequest:request];
// 4.最后將webView添加到界面
[self.view addSubview:webView];
}
4.在線文檔以前是使用WKWebView扑馁,現(xiàn)修改為是由UIWebView調(diào)用url的形式實(shí)現(xiàn), UIWebView 跟 WKWebView都可以支持js api的,js api是用來ios原生跟H5做交互的 之所以要換成WKWebView 的話 是 為了做在線文檔的離線包機(jī)制凉驻、離線預(yù)覽跟離線編輯功能腻要,要支持這些功能必須要代理截獲webView的http請(qǐng)求,UIWebView 跟 WKWebView都可以截獲代理它發(fā)出的http請(qǐng)求涝登,但是使用WKWebView來截獲代理請(qǐng)求的話雄家,會(huì)影響不那些不需要代理的請(qǐng)求,會(huì)使那些不代理的http請(qǐng)求丟失掉頭部或請(qǐng)求body等信息