亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS WebView中使用webp格式圖片的方法

2019-10-21 18:41:08
字體:
來源:轉載
供稿:網友

webp格式圖片

webp格式圖片是google推出的,相比jpg png有著巨大的優勢,同樣質量的圖片webp格式的圖片占用空間更小,在像電商這樣圖片比較多的App中,使用webp格式圖片會很有優勢。

引言

很早之前,我們的項目中就已經采用了webp格式,但是由于webView本身并不能解析webp格式,所以我們基于webView的文章詳情頁就無法使用到這項優化。 

那么有沒有什么辦法能實現呢?當然是有的。

在開始技術講解之前需要先說明,本文的技術方案,是基于本項目的情況:文章的正文大部分通過接口直接獲取到,通過在客戶端本地進行html正文組裝,最后通過webView的loadHTMLString方法進行加載顯示。普通的圖片可以通過轉換鏈接得到webp服務器獲取到相應的webp版的圖片。

本項目中,圖片緩存使用了SDWebImage,并且開啟了webp支持功能,那么我們對詳情頁webView的處理也會基于此來實現。 

通過思考,方案其實還是比較明確的,就是替換html中圖片鏈接,通過客戶端下載webp圖片,然后在通過js刷新出頁面上的下完的圖片,但實際開發中也遇到了一些坑,比如:

  • HTML解析庫的setAttributeNamed不能增加屬性
  • webp服務器圖片下載后的默認緩存時gif不能正常存儲
  • 下載完的圖片不能實時通過js更改src為本地文件地址加載出來

最終的技術實現:

1.對下載回來的html內容進行處理,獲取所有圖片鏈接,并進行webp鏈接處理轉換 

對html內容的解析處理我使用的是Objective-C-HMTL-Parser,但是該庫已經多年不維護,這里有我fork后進行部分優化調整的版本:https://github.com/YueRuo/Objective-C-HMTL-Parser (本地下載)

處理html圖片核心處理邏輯代碼:

@try { HTMLParser *parser = [[HTMLParser alloc] initWithString:htmlContent error:&error]; HTMLNode *bodyNode = [parser body]; if (error) { return; } //得到所有的img標簽 NSArray *inputNodes = [bodyNode findChildTags:@"img"]; for (HTMLNode *inputNode in inputNodes) { NSString *imageSrc = [inputNode getAttributeNamed:@"src"]; if (!imageSrc) {  continue; } NSString *newSrc = [[GlobalVariable shareInstance] resizeWebpImageWithUrl:imageSrc size:CGSizeMake((SCREEN_WIDTH - 20) * 2, 0)];//根據原圖片,得到webp服務器使用的圖片鏈接,需要有webp處理服務器 //檢查本地圖片緩存 NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:newSrc]]; NSString *localPath = [[SDImageCache sharedImageCache] defaultCachePathForKey:key]; NSString *webpImage = newSrc; BOOL localExsit = [[NSFileManager defaultManager] fileExistsAtPath:localPath]; if (localExsit) {  newSrc = [NSString stringWithFormat:@"file://%@", localPath]; } //存儲疑似webp圖片和原圖片,如果newSrc和webp相同則說明本地沒有緩存圖片 [_webpImageUrlDic setObject:webpImage forKey:newSrc]; if(localExsit){  setAttributeNamed(inputNode->_node, "src", [newSrc cStringUsingEncoding:NSUTF8StringEncoding]); }else{  setAttributeNamed(inputNode->_node, "src", "詳情頁占位圖@2x.png"); } //給img標簽中增加一個叫osrc的屬性,便于后續處理 setAttributeNamed(inputNode->_node, "osrc", [newSrc cStringUsingEncoding:NSUTF8StringEncoding]); } htmlContent = [NSMutableString stringWithString:parser.doc.rawContents];}@catch (NSException *exception) {}@finally { [webView loadHTMLString:htmlContent baseURL:baseUrl];}

2.用原生方法下載webp圖片,緩存到本地 

下載之后會存儲為jpg或png格式,這樣就可以被webView進行本地加載,但是需要注意gif的存儲特殊處理。 

另外通過實驗,直接通過js無法實時更新下載到本地的圖片,只好通過圖片的base64encode數據加載方式實現。 

具體代碼如下:

- (void)webViewDidFinishLoad:(UIWebView *)web { //處理webp格式加載 [_webpImageUrlDic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { if([obj isEqualToString:key]){//說明這圖沒有緩存,還需要下載  [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:obj] options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {  if (image&&finished) {   NSString *js;   NSRange range = [[obj lowercaseString] rangeOfString:@".gif"];//檢查是否是gif   BOOL isGif = (range.location != NSNotFound);   if (!isGif) {   [[SDImageCache sharedImageCache] storeImage:image forKey:obj];   NSString *base64 = [UIImageJPEGRepresentation(image,1) base64EncodedStringWithOptions:0];   js = [NSString stringWithFormat:@"replaceWebPImg('%@','data:image/jpeg;base64,%@')",key,base64];   }else{//gif的圖片如果直接存儲,會變成jpg從而失去動畫,因此要特殊處理   [[SDImageCache sharedImageCache] storeImage:image recalculateFromImage:false imageData:data forKey:key toDisk:true];   NSString *base64 = [data base64EncodedStringWithOptions:0];   js = [NSString stringWithFormat:@"replaceWebPImg('%@','data:image/gif;base64,%@')",key,base64];   }   [NSThread excuteInMainThread:^{   [webView stringByEvaluatingJavaScriptFromString:js];   } async:false];  }  }]; } else {//緩存中存在,那么直接加載吧  NSString *js;  NSRange range = [[obj lowercaseString] rangeOfString:@".gif"];//檢查是否是gif  NSData* data = [NSData dataWithContentsOfFile:[key stringByReplacingOccurrencesOfString:@"file://" withString:@""]];  NSString *base64 = [data base64EncodedStringWithOptions:0];  BOOL isGif = (range.location != NSNotFound);  if (!isGif) {  js = [NSString stringWithFormat:@"replaceWebPImg('%@','data:image/jpeg;base64,%@')",obj,base64];  }else{  js = [NSString stringWithFormat:@"replaceWebPImg('%@','data:image/gif;base64,%@')",obj,base64];  }  [NSThread excuteInMainThread:^{  [webView stringByEvaluatingJavaScriptFromString:js];  } async:false]; } }];} 

3.回調webView頁面,用本地鏈接替換原有的圖片

加載已下載好的圖片,這里主要通過js來實現,即第2步中的replaceWebPImg方法,該js方法可通過提前置于html的模板中,或者webViewDidFinishLoad后采用js注入進去

replaceWebPImg = function(src, localPath) { var imgs = document.querySelectorAll('img[osrc="'+src+'"]'),len = imgs.length;; for (var i = 0; i < len; i++) { var img = imgs[i]; img.src = localPath; }}

好再次總結一下整個流程:

  • 對服務器返回的htmlContent數據進行相應處理,檢查圖片是否存在緩存,存在則使用本地地址為src,不存在則把圖片的src替換成占位圖。記錄下圖片地址,并增加屬性做好標記。
  • 圖片的地址進行webp轉換,通過客戶端進行下載
  • 下載后的圖片,通過js方法進行src更改,并且賦值的base64的圖片編碼數據,因為給本地地址無法實時展示出來

這篇寫的比較簡單,更詳細的步驟請查閱上面的代碼,里面我加上還算詳細的注釋,希望對想要在webView中使用webp圖片的大家有所幫助。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品永久免费在线| 黄色一区二区在线观看| 深夜福利日韩在线看| 欧美激情网友自拍| 亚洲欧美精品一区二区| 欧美日在线观看| 国产在线视频2019最新视频| 中文字幕最新精品| 亚洲成人av在线| 国产精品视频一区二区高潮| 亚洲伊人一本大道中文字幕| 自拍视频国产精品| 国产日产欧美精品| 欧美老少做受xxxx高潮| 久久久亚洲欧洲日产国码aⅴ| 亚洲国产精久久久久久久| 亚洲欧美精品suv| 久久在线观看视频| 国产精品免费网站| 亚洲精品白浆高清久久久久久| 国产精品久久久久久久久久小说| 欧美在线欧美在线| 亚洲国产欧美一区二区丝袜黑人| 中文字幕久久久| 97成人精品视频在线观看| 国产伊人精品在线| 亚洲网站视频福利| 日韩精品在线观看一区| 91成人在线视频| 4k岛国日韩精品**专区| 中文字幕国产日韩| 久久久久久一区二区三区| 日韩电影中文字幕| 久久久精品在线观看| 欧美国产日韩一区二区在线观看| 精品毛片三在线观看| 久久亚洲精品中文字幕冲田杏梨| 隔壁老王国产在线精品| 欧美—级高清免费播放| 91爱视频在线| 国产精品视频网站| 欧美精品成人在线| 中文.日本.精品| 91美女福利视频高清| 久久久精品影院| 黄色成人av在线| 欧美在线性视频| 欧美一区二区三区四区在线| 久久久人成影片一区二区三区| 狠狠色狠色综合曰曰| 国产日本欧美在线观看| 亚洲国产精品美女| 色综合天天狠天天透天天伊人| 色婷婷综合久久久久中文字幕1| 久久高清视频免费| 欧美日韩aaaa| 欧美亚洲第一页| 在线免费看av不卡| 欧美性黄网官网| 国产日产欧美a一级在线| 曰本色欧美视频在线| 欧美精品日韩www.p站| 亚洲精品福利免费在线观看| 亚洲中国色老太| 成人精品一区二区三区| 亚洲第一区中文字幕| 日韩中文有码在线视频| 日韩久久午夜影院| 亚洲午夜精品久久久久久久久久久久| 国产精品海角社区在线观看| 欧美精品少妇videofree| 欧美在线视频免费播放| 亚洲jizzjizz日本少妇| 欧美日韩免费观看中文| 中文字幕国产亚洲2019| 欧美福利视频在线观看| 日韩电影在线观看永久视频免费网站| 国产精品美乳一区二区免费| 成人免费网站在线看| 国产丝袜一区视频在线观看| 欧美电影免费观看网站| 91亚洲精品一区二区| 国产成人一区三区| 国产成人精品久久亚洲高清不卡| 久久免费视频这里只有精品| 精品国内产的精品视频在线观看| 夜夜躁日日躁狠狠久久88av| 欧美性极品少妇精品网站| 成人免费观看网址| 91国产中文字幕| 91精品视频大全| 亚洲国产一区二区三区在线观看| 国产精品情侣自拍| 国产成人精品免高潮在线观看| 日韩在线小视频| 亚洲自拍另类欧美丝袜| 久久久久久久一区二区三区| 国产精品嫩草视频| 欧美日韩国内自拍| 国内外成人免费激情在线视频网站| 国产精品第七十二页| 国产免费成人av| 91国在线精品国内播放| 日韩在线视频二区| 亚洲色图美腿丝袜| 久久成人精品电影| 亚洲第一色在线| 国产999精品视频| 亚洲精品一区二区在线| 日韩成人激情影院| 久久久久久国产精品三级玉女聊斋| 欧美老肥婆性猛交视频| 亚洲一区中文字幕| 亚洲国产私拍精品国模在线观看| 国产一区二区三区在线播放免费观看| 一本色道久久综合狠狠躁篇的优点| 国产精品视频最多的网站| 亚洲欧美变态国产另类| 欧美黑人极品猛少妇色xxxxx| 国外视频精品毛片| 日韩免费中文字幕| 国产一区二区三区在线播放免费观看| 美日韩精品免费视频| 久久伊人精品一区二区三区| 91香蕉嫩草影院入口| 中文字幕综合一区| 日韩有码视频在线| 亚洲无线码在线一区观看| 欧美孕妇孕交黑巨大网站| 午夜精品一区二区三区av| 欧美亚洲视频在线观看| 欧美精品电影免费在线观看| 狠狠操狠狠色综合网| 国产一区私人高清影院| 亚洲天堂男人天堂女人天堂| 亚洲男人av电影| 一区二区福利视频| 中文在线不卡视频| 欧美一区第一页| 欧美一区二区影院| 成人av电影天堂| 日韩av免费在线看| 国模吧一区二区三区| 2025国产精品视频| 亚洲性日韩精品一区二区| 日韩在线免费视频观看| 国产深夜精品福利| 亚洲图片在线综合| www欧美日韩| 亚洲高清久久网| 日韩av在线网| 国产精品9999| 亚洲精品狠狠操| 国产一区二区激情| 精品国产欧美一区二区五十路| 国产精品高潮视频| 国产精品视频永久免费播放| 国产69精品久久久久9| 欧美亚洲在线视频| 欧美高清在线观看| 中文字幕av一区中文字幕天堂| 久久成人免费视频| 欧美国产日韩一区| 亚洲精品国产欧美|