WKWebView的各種好處兢卵,有不少開發(fā)者都按捺不住騷動的心王滤,開始操刀在項目里將UIWebView替換成WKWebView曲饱,然后就出現(xiàn)了《WKWebView從入門到放棄》其中WKWebView不支持NSURLProtocol就讓不少開發(fā)者望而卻步驻谆。這樣一樣象对,可能會導(dǎo)致原來UIWebView的省流量方案不生效危虱。直到前幾天,我看到了大神的這篇文章WKWebView 不支持 NSURLProtocol 嗎贸诚。大神從底層分析了龄减,WKWebView不走NSURLProtocol的原因宠能,最后得出的結(jié)論是WebKit是支持NSURLProtocol的,只是WebKit還不夠完成,另外一點是調(diào)用了私有API很可能被拒,也只支持iOS8.4+。
WKWebView的特性:
- WKWebView的性能想必不用多說了 在性能声离、穩(wěn)定性、功能方面有很大提升窿祥,直觀體現(xiàn)是內(nèi)存占用變少贝奇;
- 允許JavaScript的Nitro庫加載并使用(UIWebView中限制);
- 支持了更多的HTML5特性响谓;
- 高達60fps的滾動刷新率以及內(nèi)置手勢律适;
- 將UIWebViewDelegate與UIWebView重構(gòu)成了14類與3個協(xié)議;
NSURLProtocol工作原理
NSURLProtocol可以攔截監(jiān)聽每一個URL Loading System中發(fā)出request請求吁系,記住是URL Loading System中那些類發(fā)出的請求敬锐,也支持AFNetwoking,UIWebView發(fā)出的request辕近。如果不是這些類發(fā)出的請求变丧,NSURLProtocol就沒辦法攔截和監(jiān)聽了。
攔截代碼
調(diào)用該代碼則表示攔截成功萧芙,會將網(wǎng)頁中圖片地址轉(zhuǎn)化成WebP格式,并由SDWebImageDownloader下載并緩存宅静。
- (void)startLoading {
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
//標(biāo)示改request已經(jīng)處理過了逃糟,防止無限循環(huán)
[NSURLProtocol setProperty:@YES forKey:URLProtocolHandledKey inRequest:mutableReqeust];
NSString *URLString = [self.request.URL absoluteString];
NSURL *imageURL;
// 重定義請求地址
if ([URLString rangeOfString:@"format"].location == NSNotFound) {
imageURL = [WKWebImageHelper webImageStringToURL:URLString];
}
else {
self.connection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];
return;
}
#warning - 敲黑板 畫重點了
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL
options:0
progress:nil
completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
// 是否以png結(jié)尾
if ([imageURL.absoluteString.lowercaseString hasSuffix:@".png"]) {
data = UIImagePNGRepresentation(image);
} else {
data = UIImageJPEGRepresentation(image, 1);
}
if (!self.client) {
return ;
}
[self.client URLProtocol:self didLoadData:data];
[self.client URLProtocolDidFinishLoading:self];
}];
}
具體的代碼大家可以去我的github下載。下載地址在↓织阳。