讓W(xué)ebKit支持URLProtocol攔截實(shí)現(xiàn)WebP省流量方案《WKWebView不再從入門到放棄》

WKWebView的各種好處,有不少開發(fā)者都按捺不住騷動(dòng)的心,開始操刀在項(xiàng)目里將UIWebView替換成WKWebView,然后就出現(xiàn)了《WKWebView從入門到放棄》其中WKWebView不支持NSURLProtocol就讓不少開發(fā)者望而卻步。這樣一樣,可能會(huì)導(dǎo)致原來UIWebView的省流量方案不生效。直到前幾天,我看到了大神的這篇文章WKWebView 不支持 NSURLProtocol 嗎。大神從底層分析了,WKWebView不走NSURLProtocol的原因,最后得出的結(jié)論是WebKit是支持NSURLProtocol的,只是WebKit還不夠完成,另外一點(diǎn)是調(diào)用了私有API很可能被拒,也只支持iOS8.4+。

WKWebView的特性:

  • WKWebView的性能想必不用多說了 在性能、穩(wěn)定性、功能方面有很大提升,直觀體現(xiàn)是內(nèi)存占用變少;
  • 允許JavaScript的Nitro庫加載并使用(UIWebView中限制);
  • 支持了更多的HTML5特性;
  • 高達(dá)60fps的滾動(dòng)刷新率以及內(nèi)置手勢;
  • 將UIWebViewDelegate與UIWebView重構(gòu)成了14類與3個(gè)協(xié)議;

NSURLProtocol工作原理

NSURLProtocol可以攔截監(jiān)聽每一個(gè)URL Loading System中發(fā)出request請求,記住是URL Loading System中那些類發(fā)出的請求,也支持AFNetwoking,UIWebView發(fā)出的request。如果不是這些類發(fā)出的請求,NSURLProtocol就沒辦法攔截和監(jiān)聽了。

攔截代碼

調(diào)用該代碼則表示攔截成功,會(huì)將網(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 - 敲黑板 畫重點(diǎn)了
    [[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下載。下載地址在↓。

Demo截圖

Simulator Screen Shot 2017年3月22日 下午5.22.58.png

Demo

推薦文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 通過學(xué)習(xí),你將會(huì)學(xué)習(xí)以下幾個(gè)方面的內(nèi)容: **什么是WKWebView以及它和UIWebView的區(qū)別是什么 **...
    SOI閱讀 11,987評論 18 42
  • 前言 關(guān)于UIWebView的介紹,相信看過上文的小伙伴們,已經(jīng)大概清楚了吧,如果有問題,歡迎提問。 本文是本系列...
    CoderLF閱讀 9,366評論 2 12
  • UIWebView 之痛 開發(fā)App的過程中,常常會(huì)遇到在App內(nèi)部加載網(wǎng)頁,通常用UIWebView加載。而這個(gè)...
    zyl04401閱讀 16,233評論 46 157
  • 轉(zhuǎn)載:http://www.cnblogs.com/NSong/p/6489802.html 導(dǎo)語 WKWebVi...
    李小威閱讀 4,981評論 8 9
  • WKWebView 是蘋果在 WWDC 2014 上推出的新一代 webView 組件,用以替代 UIKit 中笨...
    Aiana閱讀 4,827評論 1 8

友情鏈接更多精彩內(nèi)容