系列文章:
- 《43- WKWebView項(xiàng)目實(shí)踐分享(二)- WKWebView介紹》
- 《38- WKWebView項(xiàng)目實(shí)踐分享(三)- native和webView交互》
- 《39- WKWebView項(xiàng)目實(shí)踐分享(四) - 先了解下Cookie》
- 《40- WKWebView項(xiàng)目實(shí)踐分享(五)- WKWebView如何加Cookie》
- 《41- WKWebView項(xiàng)目實(shí)踐分享(六)- 項(xiàng)目實(shí)踐:User Agent、跨域拼窥、重定向及其它》
- 《42- WKWebView項(xiàng)目實(shí)踐分享(七) - 補(bǔ)充: 實(shí)踐中的坑》
前言
環(huán)境:
XCode 9.3
iOS8-iOS11.3
年初,項(xiàng)目替換了WKWebView,過程中也遇到了很多問題鸯檬≡詈洌基于這些問題趁桃,結(jié)合網(wǎng)上的解決方案,自己進(jìn)行取舍以獲得一個最好的方案歇终。當(dāng)然這個最好,僅限于我目前而言逼龟。如果大家還有更高的方案评凝,希望能夠多多交流,畢竟坑不少腺律,大家一起填才能把坑填平奕短。
這篇文章主要是結(jié)合HTML5的發(fā)展歷史宜肉,對UIWebView和WKWebView進(jìn)行一個回顧和介紹◆岜看完之后谬返,你可以知道兩者的優(yōu)缺點(diǎn)、相關(guān)API日杈、已經(jīng)兩者的不同和限制遣铝。
UIWebView
UIWebView和HTML5的發(fā)展歷史
首先我們來看這張表格:
從表格里邊我們可以看出,2008年早在iOS2.0的時候莉擒,UIWebView就已經(jīng)發(fā)布了酿炸,但是HTML5的規(guī)范正式定稿和火熱的使用是在2012年之后,中間差了4年涨冀。這4年時間對于互聯(lián)網(wǎng)來說變化很大了填硕。可想基于早期HTML標(biāo)準(zhǔn)設(shè)計(jì)的UIWebView自然就不可能完全的支持HTML5的特性了蝇裤。另外廷支,UIWebView使用的時候,內(nèi)存占用巨大栓辜,native和webView交互單一恋拍,新的WebView也是呼之欲出。所以2014年WWDC,伴隨著iOS8系統(tǒng)正式推出WKWebView藕甩。
UIWebView的API
打開UIWebView.h施敢,會發(fā)現(xiàn)蘋果提供的可操作的API很少。這就意味你在加載一個webView的時候狭莱,你能處理和掌控的環(huán)節(jié)和細(xì)節(jié)就很少僵娃。簡單歸下類,如下:
創(chuàng)建
UIWebView *webView = [[UIWebView alloc] initWithFrame:myFrame];
NSURLRequest *request = [NSURLRequest requestWithURL:myURL];
[webView loadRequest:request];
UIWebViewDelegate
// 是否允許加載網(wǎng)頁腋妙,也可獲取js要打開的url
(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
// 開始加載網(wǎng)頁
(void)webViewDidStartLoad:(UIWebView *)webView;
// 網(wǎng)頁加載完成
(void)webViewDidFinishLoad:(UIWebView *)webView;
// 網(wǎng)頁加載錯誤
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
Cookie管理
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
使用NSURLProtocol
// 注冊代理
[NSURLProtocol registerClass:[self class]];
// 取消注冊代理
[NSURLProtocol unRegisterClass:[self class]];
// 整個URL Loading System的入口默怨,進(jìn)行請求的過濾,篩選出需要進(jìn)行處理的請求,表示是否可以處理這個request
(BOOL)canInitWithRequest:(NSURLRequest *)request;
// 開始請求
(void)startLoading;,
// 取消執(zhí)行請求
(void)stopLoading;
// 還有一些發(fā)起NSURLSession請求骤素, 以及NSURLSession相關(guān)代理的方法
// ...
其他方法
- (void)reload;
- (void)stopLoading;
- (void)goBack;
- (void)goForward;
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack; // 是否可以返回前一頁
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward; // 是否可以向前一頁
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
@property (nonatomic) BOOL scalesPageToFit;
UIWebView的優(yōu)缺點(diǎn)
UIWebView的優(yōu)點(diǎn):
- 操作Cookie很容易
- 可以使用NSURLRequestCachePolicy緩存策略
- 可以使用蘋果的黑魔法NSURLProtocol匙睹,可以輕松定義整個URL Loading System
在本文寫作的時候,發(fā)現(xiàn)好多大廠的App仍然在使用UIWebView济竹。讓大廠如此戀戀不舍的痕檬,想必是UIWebView的黑魔法NSURLProtocol
,在自定義NSURLProtocol
后送浊,我們就有機(jī)會對所有的請求進(jìn)行統(tǒng)一的處理梦谜,NSURLProtocol
使用起來非常方便,它可以讓你:
- 自定義請求和響應(yīng)
- 提供自定義的全局緩存支持
- 重定向網(wǎng)絡(luò)請求
- 提供HTTP Mocking (方便前期測試)
- 其他一些全局的網(wǎng)絡(luò)請求修改需求
WKWebView中并不能直接使用NSURLProtocol
而且沒有直接暴露出其相關(guān)的API。關(guān)于UIWebView中的NSURLProtocol和URL Loading System這部分唁桩,可以看一下網(wǎng)易樂得團(tuán)隊(duì)的文章《NSURLProtocol》闭树,在文章開頭寫的言簡意賅。
UIWebView的缺點(diǎn)
這里可以說WKWebView的優(yōu)點(diǎn)就是它的缺點(diǎn)荒澡, 比如說:
- 會導(dǎo)致APP占用內(nèi)存急劇上升
- native與webView交互方式單一
- 對H5新特性支持不是很好
- API太少蔼啦,給開發(fā)者可控制的細(xì)節(jié)少
WKWebView
移步:《43- WKWebView項(xiàng)目實(shí)踐分享(二)- WKWebView介紹》)
參考
強(qiáng)烈建議如果你把下邊提到的參考文章也快速看下,作為拓展和補(bǔ)充:
交流
希望能和大家交流技術(shù)
Blog:http://www.lilongcnc.cc
·