【進(jìn)階篇】iOS使用WKWebView混編開發(fā)

新聞詳情頁面第晰,算是UI中較為復(fù)雜一種碱茁,因為其中不乏會包括以下的功能:

1裸卫、HTML的內(nèi)容展示
2、夜間模式切換
3纽竣、字體大小變更
4墓贿、評論回復(fù)功能
5、評論列表的更新

image

在iOS中關(guān)于新聞詳情這類需求的解決方案有很多:

1蜓氨、native

開發(fā)上難度比較大聋袋,而且也需要后臺來配合樣式協(xié)議的制定,優(yōu)點是原生的東西穴吹,在體驗以及各個方面都會很好幽勒,缺點也同樣的,原生的這種做法開發(fā)成本很大。

2港令、Hybrid

使用webView先顯示HTML頁面內(nèi)容啥容,通過與JS的通信來控制HTML頁面中的DOM,優(yōu)點:幾乎不用太多去考慮布局的問題顷霹,使用模板的形式將要顯示的數(shù)據(jù)塞進(jìn)HTML模板中即可咪惠,通過OC和JS中通信來達(dá)到JS調(diào)用OC,或者OC調(diào)用JS泼返;缺點:在H5出來這么久的今天硝逢,用戶體驗上依然不及原生,并且一些系統(tǒng)級的功能組件調(diào)用比較麻煩。

今天主要說的是<code>Hybrid</code>這種解決方案渠鸽,在iOS8以前叫乌,iOSApp中使用的是UIWebView來加載web頁面,iOS8以后徽缚,Apple推出了新的框架<code>WebKit</code>憨奸,其中將 UIWebViewDelegate 與 UIWebView 重構(gòu)成了 14 個類和 3 個協(xié)議,引入了不少新的功能和接口凿试。

WKWebView 有以下幾大主要進(jìn)步:

1排宰、將瀏覽器內(nèi)核渲染進(jìn)程提取出 App,由系統(tǒng)進(jìn)行統(tǒng)一管理那婉,這減少了相當(dāng)一部分的性能損失板甘。
2、js 可以直接使用已經(jīng)事先注入 js runtime 的 js 接口給 Native 層傳值详炬,不必再通過苦逼的 iframe 制造頁面刷新再解析自定義協(xié)議的奇怪方式盐类。
3、支持高達(dá) 60 fps 的滾動刷新率呛谜,內(nèi)置了手勢探測在跳。

以上特性摘自別人的話,說白了就是使用WKWebView比UIWebView性能和內(nèi)存占用上都會好很多隐岛,如果要進(jìn)行Hybrid開發(fā)猫妙,在iOS8之后,強烈推薦使用
WKWebView聚凹,因為同樣的內(nèi)容割坠,在使用UIWebView時比WKWebView要慢很多,這在體驗上是很致命的元践。

使用

<i class="fa fa-github"></i>WKWebViewJavascriptBridge GitHub地址

Objective-C

引用庫
<pre><code class='objc hljs'>

#import <WebKit/WebKit.h>
#import "WKWebViewJavascriptBridge.h"
```</code></pre>
初始化
<pre><code class='objc hljs'>
WKWebView* webView = [[WKWebView alloc] init];
webView.navigationDelegate = self;
webView.UIDelegate = self;
[self.view addSubview:webView];
self.webView = webView;
//打開WKWebViewJavascriptBridge 的log
[WKWebViewJavascriptBridge enableLogging];
self.bridge = [WKWebViewJavascriptBridge bridgeForWebView:webView];
//設(shè)置代理
[self.bridge setWebViewDelegate:self];
</code></pre>

加載本地的HTML文件
<pre><code class='objc hljs'>
NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"Test" ofType:@"html"];
NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];
[webView loadHTMLString:[self replaceWithModelAppHemlString:appHtml] baseURL:baseURL];
</code></pre>

綁定Handler
<pre><code class='objc hljs'>
//registerHandler 【OC接收J(rèn)S的消息】
[self.bridge registerHandler:@"ClickTest" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"%@",data);
}];

//callHandler【OC向JS發(fā)生消息】
id data = @{ @"test": @"news" };
[self.bridge callHandler:@"ClickTest" data:data responseCallback:^(id response) {

}];
</code></pre>

>JavaScirpt

初始化
<pre><code class='objc hljs'>
// WebViewJavascriptBridge 初始化
function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) {
        return callback(WebViewJavascriptBridge);
    }
    if (window.WVJBCallbacks) {
        return window.WVJBCallbacks.push(callback);
    }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() {
        document.documentElement.removeChild(WVJBIframe)
    }, 0)
}

//WebViewJavascriptBridge 綁定事件
setupWebViewJavascriptBridge(function(bridge) {
    //registerHandler【JS接收OC的消息】
    bridge.registerHandler('ClickTest', function(data, responseCallback) {
       //改變背景顏色為黑色【Jquery操作DOM】
       $("body").css("backgroundColor","#000000"); 
    })
    //callHandler【JS向OC發(fā)送消息】
    bridge.callHandler('ClickTest', {'test': 'value'}, function responseCallback(responseData) {
    
    })
}

</code></pre>


<p style = 'color:orange;font-size:30px;margin-top:20px;'><i class="fa fa-info-circle"></i>注意事項</p>

<div style = 'color:red;font-size:18px;'>
1韭脊、使用WKWebView加載本地的HTML,在iOS8不能在HTML文件中引用本地的css或者js或者圖片文件单旁,只能在iOS9中這么做沪羔,iOS8需要將文件copy到temp文件夾中才行,所有不建議使用外部的css和js象浑,可以引用遠(yuǎn)程的蔫饰。<br/>
2、在iOS8中愉豺,使用一些遠(yuǎn)程的cdn的css或者js文件篓吁,必須注意在引用標(biāo)簽上加上charset屬性,不然css和js庫將會亂碼<br/>
3蚪拦、WKWebView性能比UIViewView性能好很多杖剪,誰用誰知道冻押。<br/>

</div>
<br/>
####演示和demo查看
<i class="fa fa-github"></i>[WKWebViewDemo Github地址](https://github.com/MethodName/WKWebViewDemo)

>換個心情去思考問題,也許很多難題就會迎刃而解盛嘿。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洛巢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子次兆,更是在濱河造成了極大的恐慌稿茉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芥炭,死亡現(xiàn)場離奇詭異漓库,居然都是意外死亡,警方通過查閱死者的電腦和手機园蝠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進(jìn)店門渺蒿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彪薛,你說我怎么就攤上這事蘸嘶。” “怎么了陪汽?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褥蚯。 經(jīng)常有香客問我挚冤,道長,這世上最難降的妖魔是什么赞庶? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任训挡,我火速辦了婚禮,結(jié)果婚禮上歧强,老公的妹妹穿的比我還像新娘澜薄。我一直安慰自己,他們只是感情好摊册,可當(dāng)我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布肤京。 她就那樣靜靜地躺著,像睡著了一般茅特。 火紅的嫁衣襯著肌膚如雪忘分。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天白修,我揣著相機與錄音妒峦,去河邊找鬼。 笑死兵睛,一個胖子當(dāng)著我的面吹牛肯骇,可吹牛的內(nèi)容都是我干的窥浪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼笛丙,長吁一口氣:“原來是場噩夢啊……” “哼漾脂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起若债,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤符相,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蠢琳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啊终,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年傲须,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓝牲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡泰讽,死狀恐怖例衍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情已卸,我是刑警寧澤佛玄,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站累澡,受9級特大地震影響梦抢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愧哟,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一奥吩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕊梧,春花似錦霞赫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甘改,卻和暖如春靴迫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楼誓。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工玉锌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疟羹。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓主守,卻偏偏與公主長得像禀倔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子参淫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容