摘要:內(nèi)部是對與的封裝,但是,它被設(shè)計成具有良好的代碼體驗。為何要從更新到倘若你仔細(xì)觀察過的內(nèi)存占用和內(nèi)存泄漏,你會認(rèn)為蘋果的工程師在此處開了小差,而這個小差很難被接受。當(dāng)改動服務(wù)端的代碼,勢必導(dǎo)致老版本中的交互失效。
1、在閱讀過無數(shù)關(guān)于WebView的文章后,才有此文的出現(xiàn)。某種意義上,此文的初衷并非技術(shù)分享,而是對抄襲的不滿。希望閱讀此文的你是干干凈凈的。
2、選擇WebView作為第一篇技術(shù)文章的原因,是因為網(wǎng)絡(luò)上眾多對于第二代webview引擎的介紹不盡人意,且關(guān)于JS交互極為模糊,做事不該是做完整嗎?倘若你想琢磨,可在源碼中一窺究竟。
3、如果你有更加高明的思路,請Email:[email protected],或者在github上說明。
4、GSWebView下載地址 GSWebView文檔
iOS8之前閉源的UIWebView與之后開源的WKWebView,在開發(fā)中為了支持iOS8以下的系統(tǒng),不免要費些功夫。很少見到一個框架能如GSWebView一般將兩者的用法簡化。
GSWebView內(nèi)部是對UIWebView與WKWebView的封裝,但是,它被設(shè)計成具有良好的代碼體驗。沒有過多的類讓人耳目眩暈。倘若你使用過UIWebView,那么,使用GSWebView則更加容易,你能很清楚的看出GSWebView是基本符合UIWebView的使用習(xí)慣。
使用GSWebView能從根本上解決開發(fā)者對于兩代web引擎封裝的困惑。
1.為何要從UIWebView更新到WKWebView?倘若你仔細(xì)觀察過UIWebView的內(nèi)存占用和內(nèi)存泄漏,你會認(rèn)為蘋果的工程師在此處開了小差,而這個小差很難被接受。當(dāng)你對比WKWebView時,你會感覺到它對于內(nèi)存占用優(yōu)化上的做出的努力。
UIWebView | WKWebView | 備注 | |
---|---|---|---|
iOS 版本 | 8.4 | 8.4 | ——— |
iPhone | 6 | 6 | 真機(jī)測試 |
測試網(wǎng)頁 | 天貓首頁 | 天貓首頁 | ——— |
內(nèi)存占用峰值 | 132.2MB | 8.4MB | ——— |
加載耗時 | 3.1s | 2.6s | mach_absolute_time(); |
FPS | 無明顯差異 | 無明顯差異 | Instruments (core animation) |
測試次數(shù) | 2 | 2 | ——— |
注:該項測試或許存在很大的主觀性,當(dāng)我加載天貓首頁時,這個結(jié)果出乎意料,差別大到令人難以接受。
2.如UIWebView一樣使用GSWebView無數(shù)的類堆積的時候,到底是OOP還是POP,當(dāng)你看到WKWebView時,GSWebView才會成為你的真愛,WKWebView的設(shè)計......哎,但性能好才是真的好!
引入WebKit與JavaScriptCore庫,就可開始使用GSWebView。
熟悉的屬性、方法
@property (nonatomic, readonly, strong) UIScrollView *scrollView; @property (nonatomic, readonly) BOOL canGoBack; @property (nonatomic, readonly) BOOL canGoForward; - (void)reload; - (void)stopLoading; - (void)goBack; - (void)goForward; //......and so on
形神皆似的協(xié)議方法
#prama mark - GSWebViewDelegate - (BOOL)gswebView:(GSWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(GSWebViewNavigationType)navigationType; - (void)gswebViewDidStartLoad:(GSWebView *)webView; - (void)gswebViewDidFinishLoad:(GSWebView *)webView; - (void)gswebView:(GSWebView *)webView didFailLoadWithError:(NSError *)error;3.GSWebView的JavaScript交互
GSWebView定義了兩套協(xié)議GSWebViewDelegate和GSWebViewJavaScript,GSWebViewDelegate定義了加載狀態(tài),GSWebViewJavaScript則只定義了JS交互。
當(dāng)你把方法名就這么一傳,連參數(shù)都不要,回調(diào)自然完成,絲滑般自然......
#prama mark - GSWebViewJavaScript /** 交互協(xié)議 */ @protocol GSWebViewJavaScript@optional /** 調(diào)用OC方法 - (NSArray *)gswebViewRegisterObjCMethodNameForJavaScriptInteraction { return @[@"getCurrentUserId"]; } - (void)getCurrentUserId:(NSString *)Id { NSLong@(@"JS調(diào)用到OC%@",Id); } */ - (NSArray *)gswebViewRegisterObjCMethodNameForJavaScriptInteraction;
改動并非是為了增加復(fù)雜度,而是GSWebView內(nèi)部的WKWebView必須通過Apple.Inc指定的方法
Adding a scriptMessageHandler adds a function window.webkit.messageHandlers.
.postMessage( ) for all frames.
EXAMPLE:
JS調(diào)用客戶端getConsultationInfo:方法,客戶端獲取到id實現(xiàn)該方法,蘋果要求必須這樣做:
//獲取客戶端iOS版本 var version = (navigator.appVersion).match(/OS (d+)_(d+)_?(d+)?/); version = parseInt(ver[1], 10); if(version >= 7.0 && version < 8.0){ getConsultationInfo(id); }else if(version>=8.0){ window.webkit.messageHandlers.getConsultationInfo.postMessage(id) }
這不是貧僧的錯,要怪就怪......
4.注意事項如果之前使用了UIWebView,如今使用GSWebView,在服務(wù)端對JS源碼做出改動后,必須要考慮客戶端老版本的兼容情況。當(dāng)改動服務(wù)端的JS代碼,勢必導(dǎo)致老版本中的UIWebView交互失效。在下有個建議:
當(dāng)GSWebView加載成功,我們調(diào)用服務(wù)端預(yù)先寫好的方法 function shouldUseLatestWebView(isBool);
NSString * shouldUseLatestWebView; if (IS_IOS_8) { shouldUseLatestWebView = [NSString stringWithFormat:@"shouldUseLatestWebView("%@")", @"1"]; }else{ shouldUseLatestWebView = [NSString stringWithFormat:@"shouldUseLatestWebView("%@")", @"0"]; } [self.webview excuteJavaScript:jsGetCurrentUserId completionHandler:^(id _Nonnull params, NSError * _Nonnull error) { if (error) { NSLog(@"注入JS方法shouldUseLatestWebView出錯:%@",[error localizedDescription]); } }];
服務(wù)端用一個全局變量保存isBool的值,當(dāng)isBool為字符串1時,說明需要使用的是第二代WebView,服務(wù)端必須使用最新的交互方式代碼,如果為字符串0或者空,則依舊使用原來的代碼交互:
//一個全局的變量 var isBool = ""; function shouldUseLatestWebView(isBool){ isBool = isBool; } if(isBool == "0" || isBool == ""){ getConsultationInfo(id); }else if(isBool == "1"){ window.webkit.messageHandlers.getConsultationInfo.postMessage(id); }
如此一來,就可以做到老版本的兼容。
5.不要吝惜你的建議大膽的批評GSWebView!
畢竟,代碼體驗與用戶體驗,都同樣,重要。
本作品采用采用知識共享署名-非商業(yè)性使用-禁止演繹 3.0 中國大陸許可協(xié)議進(jìn)行許可
*
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91038.html
摘要:背景是微信將要從切換成,前端的頁面需要進(jìn)行適配。以往在做滾動加載的組件時,微信內(nèi)的翻頁的時候老是要等待下一頁加載,現(xiàn)在終于不用等了。當(dāng)然也有坑,具體微信內(nèi)要怎么兼容看文檔。微信在,已經(jīng)開始灰度了,后續(xù)版本會全量。 WKWebView 背景是微信webview將要從UIWebView切換成WKWebView,前端的web頁面需要進(jìn)行適配。 什么是WKWebView 官方的解釋:WKWeb...
摘要:使用這種方案攔截的網(wǎng)絡(luò)請求造成的問題就是請求數(shù)據(jù)被清空,還是所為,看源碼主要看代碼中間那兩句注釋,大致的意思就是不會在進(jìn)程間通信發(fā)送的。如何解決終極思路就是雖然的會在進(jìn)程間通信時被丟棄,但不會。 github地址:JXBWKWebView,如果覺得項目不錯可以點個star支持一下,謝謝~ 前言 目前iOS系統(tǒng)已經(jīng)更新到iOS11,大多數(shù)項目向下兼容最多兼容到iOS8,因此,在項目中對...
摘要:使用這種方案攔截的網(wǎng)絡(luò)請求造成的問題就是請求數(shù)據(jù)被清空,還是所為,看源碼主要看代碼中間那兩句注釋,大致的意思就是不會在進(jìn)程間通信發(fā)送的。如何解決終極思路就是雖然的會在進(jìn)程間通信時被丟棄,但不會。 github地址:JXBWKWebView,如果覺得項目不錯可以點個star支持一下,謝謝~ 前言 目前iOS系統(tǒng)已經(jīng)更新到iOS11,大多數(shù)項目向下兼容最多兼容到iOS8,因此,在項目中對...
閱讀 1096·2021-11-22 14:56
閱讀 1537·2019-08-30 15:55
閱讀 3379·2019-08-30 15:45
閱讀 1668·2019-08-30 13:03
閱讀 2881·2019-08-29 18:47
閱讀 3346·2019-08-29 11:09
閱讀 2652·2019-08-26 18:36
閱讀 2629·2019-08-26 13:55