国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

裝飾模式整合UIWebView與WKWebView

xuexiangjys / 2753人閱讀

摘要:內(nèi)部是對(duì)與的封裝,但是,它被設(shè)計(jì)成具有良好的代碼體驗(yàn)。為何要從更新到倘若你仔細(xì)觀察過(guò)的內(nèi)存占用和內(nèi)存泄漏,你會(huì)認(rèn)為蘋(píng)果的工程師在此處開(kāi)了小差,而這個(gè)小差很難被接受。當(dāng)改動(dòng)服務(wù)端的代碼,勢(shì)必導(dǎo)致老版本中的交互失效。


1、在閱讀過(guò)無(wú)數(shù)關(guān)于WebView的文章后,才有此文的出現(xiàn)。某種意義上,此文的初衷并非技術(shù)分享,而是對(duì)抄襲的不滿。希望閱讀此文的你是干干凈凈的。
2、選擇WebView作為第一篇技術(shù)文章的原因,是因?yàn)榫W(wǎng)絡(luò)上眾多對(duì)于第二代webview引擎的介紹不盡人意,且關(guān)于JS交互極為模糊,做事不該是做完整嗎?倘若你想琢磨,可在源碼中一窺究竟。
3、如果你有更加高明的思路,請(qǐng)Email:xorshine@icloud.com,或者在github上說(shuō)明。
4、GSWebView下載地址 GSWebView文檔

iOS8之前閉源的UIWebView與之后開(kāi)源的WKWebView,在開(kāi)發(fā)中為了支持iOS8以下的系統(tǒng),不免要費(fèi)些功夫。很少見(jiàn)到一個(gè)框架能如GSWebView一般將兩者的用法簡(jiǎn)化。

GSWebView內(nèi)部是對(duì)UIWebView與WKWebView的封裝,但是,它被設(shè)計(jì)成具有良好的代碼體驗(yàn)。沒(méi)有過(guò)多的類(lèi)讓人耳目眩暈。倘若你使用過(guò)UIWebView,那么,使用GSWebView則更加容易,你能很清楚的看出GSWebView是基本符合UIWebView的使用習(xí)慣。

使用GSWebView能從根本上解決開(kāi)發(fā)者對(duì)于兩代web引擎封裝的困惑。

1.為何要從UIWebView更新到WKWebView?

倘若你仔細(xì)觀察過(guò)UIWebView的內(nèi)存占用和內(nèi)存泄漏,你會(huì)認(rèn)為蘋(píng)果的工程師在此處開(kāi)了小差,而這個(gè)小差很難被接受。當(dāng)你對(duì)比WKWebView時(shí),你會(huì)感覺(jué)到它對(duì)于內(nèi)存占用優(yōu)化上的做出的努力。

性能測(cè)試:
UIWebView WKWebView 備注
iOS 版本 8.4 8.4 ———
iPhone 6 6 真機(jī)測(cè)試
測(cè)試網(wǎng)頁(yè) 天貓首頁(yè) 天貓首頁(yè) ———
內(nèi)存占用峰值 132.2MB 8.4MB ———
加載耗時(shí) 3.1s 2.6s mach_absolute_time();
FPS 無(wú)明顯差異 無(wú)明顯差異 Instruments (core animation)
測(cè)試次數(shù) 2 2 ———

注:該項(xiàng)測(cè)試或許存在很大的主觀性,當(dāng)我加載天貓首頁(yè)時(shí),這個(gè)結(jié)果出乎意料,差別大到令人難以接受。

2.如UIWebView一樣使用GSWebView

無(wú)數(shù)的類(lèi)堆積的時(shí)候,到底是OOP還是POP,當(dāng)你看到WKWebView時(shí),GSWebView才會(huì)成為你的真愛(ài),WKWebView的設(shè)計(jì)......哎,但性能好才是真的好!

引入WebKit與JavaScriptCore庫(kù),就可開(kāi)始使用GSWebView。

使用介紹:同樣都是WebView,同樣的款式,GSWebView如何打造不一樣的內(nèi)涵與代碼體驗(yàn)?

熟悉的屬性、方法

@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;

改動(dòng)并非是為了增加復(fù)雜度,而是GSWebView內(nèi)部的WKWebView必須通過(guò)Apple.Inc指定的方法

Adding a scriptMessageHandler adds a function window.webkit.messageHandlers..postMessage() for all frames.

EXAMPLE:
JS調(diào)用客戶端getConsultationInfo:方法,客戶端獲取到id實(shí)現(xiàn)該方法,蘋(píng)果要求必須這樣做:

//獲取客戶端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)
} 

這不是貧僧的錯(cuò),要怪就怪......

4.注意事項(xiàng)

如果之前使用了UIWebView,如今使用GSWebView,在服務(wù)端對(duì)JS源碼做出改動(dòng)后,必須要考慮客戶端老版本的兼容情況。當(dāng)改動(dòng)服務(wù)端的JS代碼,勢(shì)必導(dǎo)致老版本中的UIWebView交互失效。在下有個(gè)建議:
當(dāng)GSWebView加載成功,我們調(diào)用服務(wù)端預(yù)先寫(xiě)好的方法 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出錯(cuò):%@",[error localizedDescription]);
    }
}];

服務(wù)端用一個(gè)全局變量保存isBool的值,當(dāng)isBool為字符串1時(shí),說(shuō)明需要使用的是第二代WebView,服務(wù)端必須使用最新的交互方式代碼,如果為字符串0或者空,則依舊使用原來(lái)的代碼交互:

//一個(gè)全局的變量
var isBool = "";

function shouldUseLatestWebView(isBool){ 
    isBool = isBool;
}

if(isBool == "0" || isBool == ""){ 
    getConsultationInfo(id); 
}else if(isBool == "1"){ 
     window.webkit.messageHandlers.getConsultationInfo.postMessage(id);
} 

如此一來(lái),就可以做到老版本的兼容。

5.不要吝惜你的建議

大膽的批評(píng)GSWebView!
畢竟,代碼體驗(yàn)與用戶體驗(yàn),都同樣,重要。


本作品采用采用知識(shí)共享署名-非商業(yè)性使用-禁止演繹 3.0 中國(guó)大陸許可協(xié)議進(jìn)行許可

*

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91038.html

相關(guān)文章

  • WKWebView微信適配

    摘要:背景是微信將要從切換成,前端的頁(yè)面需要進(jìn)行適配。以往在做滾動(dòng)加載的組件時(shí),微信內(nèi)的翻頁(yè)的時(shí)候老是要等待下一頁(yè)加載,現(xiàn)在終于不用等了。當(dāng)然也有坑,具體微信內(nèi)要怎么兼容看文檔。微信在,已經(jīng)開(kāi)始灰度了,后續(xù)版本會(huì)全量。 WKWebView 背景是微信webview將要從UIWebView切換成WKWebView,前端的web頁(yè)面需要進(jìn)行適配。 什么是WKWebView 官方的解釋?zhuān)篧KWeb...

    olle 評(píng)論0 收藏0
  • WKWebView使用指南|功能豐富的JXBWKWebView

    摘要:使用這種方案攔截的網(wǎng)絡(luò)請(qǐng)求造成的問(wèn)題就是請(qǐng)求數(shù)據(jù)被清空,還是所為,看源碼主要看代碼中間那兩句注釋?zhuān)笾碌囊馑季褪遣粫?huì)在進(jìn)程間通信發(fā)送的。如何解決終極思路就是雖然的會(huì)在進(jìn)程間通信時(shí)被丟棄,但不會(huì)。 github地址:JXBWKWebView,如果覺(jué)得項(xiàng)目不錯(cuò)可以點(diǎn)個(gè)star支持一下,謝謝~ 前言 目前iOS系統(tǒng)已經(jīng)更新到iOS11,大多數(shù)項(xiàng)目向下兼容最多兼容到iOS8,因此,在項(xiàng)目中對(duì)...

    mist14 評(píng)論0 收藏0
  • WKWebView使用指南|功能豐富的JXBWKWebView

    摘要:使用這種方案攔截的網(wǎng)絡(luò)請(qǐng)求造成的問(wèn)題就是請(qǐng)求數(shù)據(jù)被清空,還是所為,看源碼主要看代碼中間那兩句注釋?zhuān)笾碌囊馑季褪遣粫?huì)在進(jìn)程間通信發(fā)送的。如何解決終極思路就是雖然的會(huì)在進(jìn)程間通信時(shí)被丟棄,但不會(huì)。 github地址:JXBWKWebView,如果覺(jué)得項(xiàng)目不錯(cuò)可以點(diǎn)個(gè)star支持一下,謝謝~ 前言 目前iOS系統(tǒng)已經(jīng)更新到iOS11,大多數(shù)項(xiàng)目向下兼容最多兼容到iOS8,因此,在項(xiàng)目中對(duì)...

    Cobub 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<