WebView與native交互-WebViewBridge.Swift

緣由閑扯

話說WebView 與 Native的交互并不復(fù)雜挺物;似乎需不需要什么封裝,項(xiàng)目之初也是這么想的,只是需求的增加湘换,UIWebView和WKWebView的混合使用(WKWebView性能好些医窿,只是確實(shí)由不少問題參見 <a >WKWebViewTips</a>伸但, 補(bǔ)充:修改WKWebView的contentInset會(huì)導(dǎo)致位置計(jì)算出錯(cuò),導(dǎo)致js點(diǎn)擊出現(xiàn)問題)留搔;代碼變得也就難以維護(hù)更胖;話說不造輪子的廚師不是好裁縫;開源的項(xiàng)目不少隔显,研究了下却妨,重新設(shè)計(jì),然后有了 <a >WebViewBridge.Swift</a>

簡(jiǎn)介

WebView與Native橋并不是一個(gè)新的話題, 在很早以前就有實(shí)現(xiàn)了, 也有很好的實(shí)現(xiàn).比如 <a >Cordova(PhoneGap)</a>, <a >WebViewJavascriptBridge</a>橋本身的技術(shù)并不困難, 實(shí)現(xiàn)也都大同小異, 既然已經(jīng)有項(xiàng)目 <a >Cordova(PhoneGap)</a>, <a >WebViewJavascriptBridge</a>, 那還有必要重復(fù)再造輪子么?

  • Cordova-ios: 本身是一個(gè)很了不起的項(xiàng)目, 提供了多個(gè)平臺(tái), 對(duì)于 Hybrid App而言, 是一個(gè)很好的選擇;如果你編寫的不是Hybrid App, 只是想簡(jiǎn)單的集成 bridge這個(gè)功能, Cordova 就顯得過于復(fù)雜了, 不方面集成, 另外暫時(shí)也無 swift 版本的
  • WebViewJavascriptBridge: 也很不錯(cuò), 同時(shí)提供了 iOS, android 版本, 集成也簡(jiǎn)單方便. 有以下幾點(diǎn)不足:
    • UIWebView/WKWebView: 采用的舊式的 iframe 方式來實(shí)現(xiàn), 集成相對(duì)麻煩
    • 沒有提供 Swift 版本

WebViewBridge.Swift 給你提供了另一種可能, 與其他相比由以下優(yōu)點(diǎn):

  • 采用 JavaScriptCore, 棄用iframe括眠,使用更簡(jiǎn)單 (并非完全棄用iframe, 在webViewDidFinishLoad之前可能仍會(huì)使用iframe)
  • 全 Swift 實(shí)現(xiàn)
    WebViewBridge.Swift 是你的一個(gè)不錯(cuò)的選擇.

此外: 對(duì)于此外常見的 webview點(diǎn)擊下載圖片, 實(shí)例代碼中頁給出了實(shí)現(xiàn).
(注意實(shí)例代碼中, 下載緩存圖片代碼是有bug的,可以考慮使用第三方圖片庫, 比如 <a >Kingfisher</a>)

前提: 為WebView和html建立橋

1 給 UIWebView/WKWebView 建立橋

let webView = WKWebView()
let bridge = ZHWebViewBridge.bridge(webView)
  • Note: 對(duì)于 UIWebView 需要注意一下事情
    • 拷貝 bridge.js 代碼到你的html文件中
    • 需要主動(dòng)調(diào)用 bridge.teardown() 用于釋放對(duì)你的 UIWebView的強(qiáng)引用

原生代碼與 JS 的相互交互

1, 原生代碼調(diào)用 js handler

a, 在你的html中或業(yè)務(wù) js 中 添加 js handler

ZHWVBridge.Core.registerJsHandler(
          "Device.updateAppVersion",
          function (version) {
            document.getElementById("native-version-container").textContent = version;
            return "js get version: " + version;
          });
  • 說明: ZHWVBridge.Core.registerJsHandler(handlerName, callback)

b, 原生代碼調(diào)用 js handler

bridge.callJsHandler(
            "Device.updateAppVersion",
            args: ["1.2"],
            callback: { (data:AnyObject?) in
                // here data should be "js get version: 1.2"
                ...
        })
  • 說明: bridge.callJsHandler(handlerName, 傳遞給js的參數(shù)數(shù)組, callback)

2, Js 調(diào)用原生 handler

a, 原生代碼中, bridge 注冊(cè) native handler

bridge.registerHandler("Image.updatePlaceHolder") { (args:[AnyObject]) -> (Bool, [AnyObject]?) in
            return (true, ["place_holder.png"])
        }

b, js 調(diào)用原生 handler

ZHWVBridge.Core.callNativeHandler(
            "Image.updatePlaceHolder",
            [],
            function(placeHolder) {
              var items = document.getElementsByTagName('img');
              for (var i = 0, count = items.length; i < count; ++i) {
                var item = items[i];
                if (item.src.toLocaleLowerCase() == "file:///default_cover") {
                  item.src = placeHolder;
                }
              }
            });
  • 說明: ZHWVBridge.Core.callNativeHandler(handlerName, 傳遞給原生handler的參數(shù)數(shù)組, 成功回調(diào), 失敗回調(diào))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彪标,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掷豺,更是在濱河造成了極大的恐慌捞烟,老刑警劉巖薄声,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異题画,居然都是意外死亡默辨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門苍息,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缩幸,“玉大人,你說我怎么就攤上這事竞思”硪辏” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵盖喷,是天一觀的道長(zhǎng)爆办。 經(jīng)常有香客問我,道長(zhǎng)课梳,這世上最難降的妖魔是什么押逼? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮惦界,結(jié)果婚禮上挑格,老公的妹妹穿的比我還像新娘。我一直安慰自己沾歪,他們只是感情好漂彤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灾搏,像睡著了一般挫望。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狂窑,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天媳板,我揣著相機(jī)與錄音,去河邊找鬼泉哈。 笑死蛉幸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丛晦。 我是一名探鬼主播奕纫,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼烫沙!你這毒婦竟也來了匹层?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤锌蓄,失蹤者是張志新(化名)和其女友劉穎升筏,沒想到半個(gè)月后撑柔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡您访,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铅忿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洋只。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昼捍,靈堂內(nèi)的尸體忽然破棺而出识虚,到底是詐尸還是另有隱情,我是刑警寧澤妒茬,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布担锤,位于F島的核電站,受9級(jí)特大地震影響乍钻,放射性物質(zhì)發(fā)生泄漏肛循。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一银择、第九天 我趴在偏房一處隱蔽的房頂上張望多糠。 院中可真熱鬧,春花似錦浩考、人聲如沸夹孔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搭伤。三九已至,卻和暖如春袜瞬,著一層夾襖步出監(jiān)牢的瞬間怜俐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工邓尤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拍鲤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓汞扎,卻偏偏與公主長(zhǎng)得像殿漠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佩捞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • JSBridge 1. Why do we need JSBridge? 2. Why is “JS”Bridge...
    loveqin閱讀 9,168評(píng)論 0 7
  • 前言:iOS 開發(fā)中绞幌,h5 和原生實(shí)現(xiàn)通信有多種方式, JSBridge 就是最常用的一種一忱,各 JSBridge ...
    ShannonChenCHN閱讀 8,482評(píng)論 11 63
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫莲蜘、插件谭确、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,104評(píng)論 4 62
  • 隨著H5技術(shù)的興起,在iOS開發(fā)過程中票渠,難免會(huì)遇到原生應(yīng)用需要和H5頁面交互的問題逐哈。其中會(huì)涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,075評(píng)論 1 8
  • 早晨起床,窗外一片陽光燦爛问顷,忍不住對(duì)窗觀景昂秃。忽見對(duì)面樓上一個(gè)大琉璃喇叭直垂而下,猶如一把冰劍杜窄,晶瑩剔透肠骆,甚是好...
    遙望江南閱讀 152評(píng)論 0 1