【烤面筋】你真的了解混合編程论寨?

移動(dòng)互聯(lián)網(wǎng)時(shí)代星立,混合編程對(duì)于前端同學(xué)來說是不可回避的課題爽茴,相信大部分同學(xué)都有曾做過并且使用上堪稱熟練,但是面試的時(shí)候绰垂,你的回答真的能用面試官感到滿意么室奏?

一、什么是混合編程劲装?

基于webview的h5具有跨平臺(tái)的特性胧沫,但是在體驗(yàn)上跟原生native組件比起來要遜色不少(至少目前是這樣),并且功能上也會(huì)有局限(例如消息推送占业,獲取設(shè)備網(wǎng)絡(luò)狀態(tài)等等)绒怨,另外,一些安全性要求較高的敏感數(shù)據(jù)也不宜放在網(wǎng)頁中谦疾。所以我們需要混合編程南蹂,結(jié)合使用兩者,發(fā)揮各自的優(yōu)勢(shì)念恍。

混合編程在形式上也有不同的偏重點(diǎn)六剥,目前市面上流行的ionic、phoneGap和h5+(hbuilder)峰伙,已經(jīng)將h5和native的橋接通信封裝得密不透風(fēng)疗疟,并且實(shí)現(xiàn)了足夠多的native接口讓使用者選擇調(diào)用(打包的時(shí)候還可以選擇打包),使用者更多的是使用h5技術(shù)去開發(fā)瞳氓,無需native的同事支持策彤,這種形式的側(cè)重點(diǎn)在h5上,native只需要搭建一個(gè)殼顿膨,適合沒有足夠人力的小團(tuán)隊(duì)锅锨;而技術(shù)叽赊、人力資源雄厚的公司恋沃,更愿意自己實(shí)現(xiàn)一套H5和native的通信鏈路,靈活的定制需要的native接口供少量的h5頁面使用必指,更多的功能交由原生團(tuán)隊(duì)進(jìn)行開發(fā)囊咏,這種形式的側(cè)重點(diǎn)就在native上了。

并不是說公司自身實(shí)現(xiàn)一套h5和native的互調(diào)機(jī)制側(cè)重點(diǎn)就一定在native上塔橡,這完全看公司的戰(zhàn)略梅割,有資源實(shí)現(xiàn)自己的一套東西,當(dāng)然能更加靈活

說了這么多葛家,不知道你有沒有發(fā)現(xiàn)户辞,混合編程的核心在于實(shí)現(xiàn)一套h5和native的通信鏈路(互調(diào)機(jī)制),如果你只是把自己定位為一個(gè)使用者癞谒,也許并不用關(guān)心這其中的實(shí)現(xiàn)細(xì)節(jié)底燎,但可以肯定的是刃榨,在面試的時(shí)候,你在這個(gè)話題上跟面試官扯不上幾句双仍,還是那句話枢希,跳出自己的思維舒適區(qū),深入原理

二朱沃、h5和native是如何互調(diào)的

參考資料:H5與Native交互之JSBridge技術(shù)

native調(diào)用js有現(xiàn)成的方法苞轿,方式比較簡單:

    /***********native 調(diào) js***************/
    // Swift
    webview.stringByEvaluatingJavaScriptFromString("Math.random()")  
    // OC
    [webView stringByEvaluatingJavaScriptFromString:@"Math.random();"];

    /*************android 調(diào) js************************/
    // java調(diào)js
    webView.loadUrl("javascript:Math.random();"); 

js調(diào)用native,android平臺(tái)和ios平臺(tái)的支持程度不太一樣逗物。
在android平臺(tái)中搬卒,有三種方式:
1)通過注解的方式向webview當(dāng)中注入java方法

// java代碼
class JSInterface {  
    @JavascriptInterface //注意這個(gè)代碼一定要加上
    public String getUserData() {
        return "UserData";
    }
}
webView.addJavascriptInterface(new JSInterface(), "AndroidJS");  

// js代碼
alert(AndroidJS.getUserData()) //UserDate  
  1. 在android webview中重寫原生的promat、console.log或者alert(一般是重寫promat翎卓,因?yàn)檫@個(gè)方法用得少)
    class MyChromeClient extends WebChromeClient {  
        @Override
        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
            // 這里就可以對(duì)js的prompt進(jìn)行處理秀睛,通過result返回結(jié)果
        }
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {

        }
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

        }
    }
  1. 監(jiān)聽偽協(xié)議請(qǐng)求,在ios中只能采取這種方式莲祸,所以適合讓ios來現(xiàn)身說法

在ios平臺(tái)中蹂安,監(jiān)聽偽協(xié)議實(shí)現(xiàn)js對(duì)native的調(diào)用:
在UIWebView內(nèi)發(fā)起的所有網(wǎng)絡(luò)請(qǐng)求,都可以通過delegate函數(shù)在Native層得到通知锐帜,那么我們可以定義一個(gè)偽協(xié)議田盈,例如:jsBridge://,然后在delegate中監(jiān)聽所有的網(wǎng)絡(luò)請(qǐng)求缴阎,一旦發(fā)現(xiàn)是jsBridge開頭的允瞧,將直接轉(zhuǎn)入響應(yīng)的調(diào)用邏輯中,這種曲線救國的方式蛮拔,在android平臺(tái)上也同樣適用述暂。

發(fā)起這樣的網(wǎng)絡(luò)請(qǐng)求,我們可以通過location.href建炫,也可以載入一個(gè)隱藏的iframe畦韭,通過location.href的方式請(qǐng)求有一個(gè)明顯的漏洞,當(dāng)多個(gè)請(qǐng)求連續(xù)發(fā)起的時(shí)候肛跌,在native層只能監(jiān)聽到最后一個(gè)請(qǐng)求艺配,其它請(qǐng)求調(diào)用都將被忽略,所以應(yīng)當(dāng)采取iframe的方式

適配層:
如你所見衍慎,混合編程中转唉,h5的調(diào)用代碼是統(tǒng)一的,那是因?yàn)樵谀憧床灰姡ɑ蛘卟幌肟匆姡┑牡胤轿壤Γ瑒e人進(jìn)行了android和ios平臺(tái)的適配赠法,并封裝了底層調(diào)用方式

這里就不貼代碼了,感興趣的同學(xué)可以當(dāng)做一個(gè)課外作業(yè)讓去實(shí)現(xiàn)這套適配代碼乔夯, 可以參考本章開頭處提供的參考資料砖织,有贊團(tuán)隊(duì)已經(jīng)在文末貼出了他們的代碼封裝原朝。而且,就在你天天提交代碼的倉庫中镶苞,說不定已經(jīng)有某個(gè)大牛同事已經(jīng)實(shí)現(xiàn)了一套成熟的封裝喳坠,你還沒來得及研讀

三、webview窗口頁面跳轉(zhuǎn)

雖說理解了h5跟native的通信機(jī)制之后茂蚓,接口的調(diào)用并不難理解壕鹉,但是由于對(duì)native的機(jī)制不太了解,經(jīng)常有同學(xué)分不清webview中的頁面跳轉(zhuǎn)location.href和調(diào)用native的方法重新創(chuàng)建一個(gè)webview窗口進(jìn)行的頁面切換有何區(qū)別聋涨,所以這個(gè)問題有必要來說明一下

我們知道晾浴,通過location.href進(jìn)行的url跳轉(zhuǎn),當(dāng)前webview容器里面重新載入新的資源內(nèi)容牍白,但是在native應(yīng)用中脊凰,是通過navigatorpushpop來管理窗口的,當(dāng)從列表頁跳轉(zhuǎn)到詳情頁的時(shí)候茂腥,新建一個(gè)詳情窗口狸涌,pushnavigator中,新的詳情窗口將層疊在列表窗口中最岗,當(dāng)從詳情頁返回時(shí)帕胆,詳情窗口將會(huì)被從navigatorpop出來(并進(jìn)行銷毀),列表窗口重新成為當(dāng)前可見的活動(dòng)窗口

我們?cè)谶M(jìn)行混合編程的時(shí)候般渡,不希望在頁面跳轉(zhuǎn)的時(shí)候懒豹,沿用瀏覽器在當(dāng)前窗口重新載入資源內(nèi)容的體驗(yàn)方式(往往有一個(gè)空白頁的過程);而是采取調(diào)用native的新建窗口方法驯用,打開一個(gè)新的webview窗口脸秽,載入新的頁面鏈接內(nèi)容,這樣就可以擁有native的過渡動(dòng)畫體驗(yàn)

以上討論的是多頁面應(yīng)用蝴乔,但單頁spa應(yīng)用中记餐,通過location.history模擬的路由跳轉(zhuǎn),通過ajax載入的功能頁面淘这,也可以在一個(gè)webview窗口中模擬native的過渡動(dòng)畫

千萬別再混淆location.href和窗口跳轉(zhuǎn)了剥扣,前者只有一個(gè)webview巩剖,后者有多個(gè)webview窗口铝穷。
另外,單頁spa應(yīng)用也是可以模擬窗口跳轉(zhuǎn)的過渡動(dòng)畫的

總結(jié)

如果你只是會(huì)用佳魔,那么公司很樂于把你招進(jìn)來干點(diǎn)臟活累活曙聂;但是如果你理解深沉的實(shí)現(xiàn)機(jī)制,公司會(huì)希望將你招進(jìn)來搭建底層框架鞠鲜,甚至是作為一個(gè)前端架構(gòu)師指揮大家干活

菲麥前端專題宁脊,匯聚前端好文断国,邀您關(guān)注!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榆苞,一起剝皮案震驚了整個(gè)濱河市稳衬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坐漏,老刑警劉巖薄疚,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赊琳,居然都是意外死亡街夭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門躏筏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來板丽,“玉大人,你說我怎么就攤上這事趁尼“<睿” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵酥泞,是天一觀的道長乃正。 經(jīng)常有香客問我,道長婶博,這世上最難降的妖魔是什么瓮具? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮凡人,結(jié)果婚禮上名党,老公的妹妹穿的比我還像新娘。我一直安慰自己挠轴,他們只是感情好传睹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岸晦,像睡著了一般欧啤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上启上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天邢隧,我揣著相機(jī)與錄音,去河邊找鬼冈在。 笑死倒慧,一個(gè)胖子當(dāng)著我的面吹牛拿愧,可吹牛的內(nèi)容都是我干的控嗜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼卑雁!你這毒婦竟也來了遇伞?” 一聲冷哼從身側(cè)響起象踊,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤锉矢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后询吴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俩垃,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年汰寓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了口柳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡有滑,死狀恐怖跃闹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毛好,我是刑警寧澤望艺,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站肌访,受9級(jí)特大地震影響找默,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吼驶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一惩激、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蟹演,春花似錦风钻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羞反,卻和暖如春布朦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昼窗。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工是趴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膏秫。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓右遭,卻偏偏與公主長得像做盅,于是被迫代替她去往敵國和親缤削。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窘哈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,782評(píng)論 25 707
  • 前言 關(guān)于UIWebView的介紹,相信看過上文的小伙伴們亭敢,已經(jīng)大概清楚了吧滚婉,如果有問題,歡迎提問帅刀。 本文是本系列...
    CoderLF閱讀 8,953評(píng)論 2 12
  • 跟原生開發(fā)相比让腹,H5的開發(fā)相對(duì)來一個(gè)成熟的框架和團(tuán)隊(duì)來講在開發(fā)速度和開發(fā)效率上有著比原生很大的優(yōu)勢(shì),至少不用等待審...
    大沖哥閱讀 1,838評(píng)論 0 7
  • 被三觀不合但要努力去融合的想法洗腦了幾天.....不知不覺間多細(xì)小的事情都要來比較扣溺,甚至在剛剛觀看完透明人的采訪時(shí)...
    前小語閱讀 275評(píng)論 0 0
  • 只想住在白云深處 低頭就見青嵐 凝目 弦月當(dāng)空 滿眼都是星辰 都是藍(lán) 都是靜 清風(fēng)在身體里 透過來 透過去 我仿佛...
    夢(mèng)雙眸閱讀 415評(píng)論 1 24