H5與iOS/Android的通信方式(原生內(nèi)嵌H5頁(yè)面通信模式淺析)---新增JsBridge和WebViewJavascriptBridge

一蚓耽、非引入JsBridge或WebViewJavascriptBridge庫(kù)的方案

1渠牲、H5與iOS/Android的通信方式

H5 webview與iOS通信

① 原生iOS調(diào)用js的方法(前端工程師可簡(jiǎn)單理解,掛載在windows對(duì)象下的js方法iOS原生都可以調(diào)用觸發(fā))
原生iOS可以訪問webview全局對(duì)象(windows對(duì)象下個(gè)的屬性)步悠,所以當(dāng)我們要讓iOS調(diào)用我們js的某些方法的可以在window下添加一個(gè)jsBridge對(duì)象签杈,里面可以定義給iOS調(diào)用的一些js方法。

②Js調(diào)用原生iOS(OC或Swift)方法
反過來鼎兽,JS調(diào)用原生iOS并沒有現(xiàn)成的API可以直接拿過來使用答姥,而是間接的利用一些方法來實(shí)現(xiàn)---->利用ios的UIWebview組件的特性铣除,在UIWebview內(nèi)發(fā)起的所有的網(wǎng)絡(luò)請(qǐng)求,都可以通過delegate函數(shù)在native層得到通知踢涌。簡(jiǎn)單點(diǎn)說就是我們H5頁(yè)面url路徑的跳轉(zhuǎn)請(qǐng)求,原生iOS這邊都可以抓到序宦,利用此特點(diǎn)我們可以像在get請(qǐng)求URL后面帶參數(shù)一樣帶參數(shù)讓原生iOS去取到睁壁。(利用url的這個(gè)過程需要前端和原生這邊約定好這個(gè)url的格式,例如:jsbridge://methodName?param1=value1&param2=value2互捌,只要以jsbridge://開頭的地址就不要讓webview進(jìn)行頁(yè)面的跳轉(zhuǎn)潘明,轉(zhuǎn)而執(zhí)行相應(yīng)的邏輯,原生可以把要傳給vebview的某個(gè)數(shù)據(jù)掛在到window下的某個(gè)屬性上秕噪,js通過window.屬性名取到原生傳來的數(shù)據(jù))

上面提到的url的跳轉(zhuǎn)讓原生去攔截的方案钳降,js這邊實(shí)現(xiàn)方式有兩種:
①window.location.href
②利用頁(yè)面中嵌套的iframe的url(將iframe的長(zhǎng)寬都設(shè)為很小或者0,取到數(shù)據(jù)后再移除這個(gè)iframe)
建議使用②iframe的方式腌巾,因?yàn)槿绻覀冞B續(xù)多次修改window.location.href的值遂填,在Native層只能接收到最后一次請(qǐng)求,前面的請(qǐng)求都會(huì)被忽略掉澈蝙。

iframe方式前端代碼

H5 webview與Android通信

1吓坚、目前js有三種調(diào)用原生Android的方式:

① 和上面Js調(diào)用原生iOS(OC或Swift)方法一樣,通過schema方式灯荧,Native使用shouldOverrideUrlLoading方法對(duì)url協(xié)議進(jìn)行解析礁击。這種js的調(diào)用方式與ios的一樣,使用iframe來調(diào)用native代碼逗载。(原理和使用方式與上面講的iOS攔截url的一樣哆窿,建議ios和android端都采用此方式,那么前端也將方便做兼容些)

② 往webview里面注入方法厉斟,前端角度理解就是Android創(chuàng)建了一個(gè)方法挚躯,添加到我們js的window對(duì)象里面了,直接調(diào)用就可以觸發(fā)原生的方法擦秽,如下代碼:

實(shí)例代碼

③ 使用prompt秧均、console.log、alert等方式号涯,這三個(gè)方法對(duì)js里是屬于原生的目胡,例如當(dāng)我們js代碼中使用alert(data)時(shí),原生這邊可以抓到data數(shù)據(jù)链快,然后它們進(jìn)行相應(yīng)的操作誉己,一般我們使用prompt,因?yàn)檫@個(gè)在js代碼里面使用的很少域蜗,用來和native通訊副作用較少巨双。

2噪猾、原生Android調(diào)用javascript方法通過在android代碼里使用webview的loadUrl進(jìn)行調(diào)用。

安卓中的代碼如上筑累,需要被原生調(diào)用的js方法放全局

2袱蜡、js調(diào)用Native方法的封裝,兼容安卓和ios慢宗,供參考


兼顧iOS和Android通信的js代碼

二坪蚁、引入JsBridge(安卓)或WebViewJavascriptBridge(iOS)庫(kù)的方案

安卓端的JsBridge: ? ?https://github.com/lzyzsd/JsBridge
iOS端的WebViewJavascriptBridge: ?https://github.com/marcuswestin/WebViewJavascriptBridge

實(shí)際項(xiàng)目中有相當(dāng)一部分的原生內(nèi)嵌H5頁(yè)面混合開發(fā)的項(xiàng)目采用這個(gè)方案,使用上來說也很簡(jiǎn)單镜沽,其實(shí)就是對(duì)上面第一部分講的幾種實(shí)現(xiàn)原生與H5頁(yè)面通信方式的一個(gè)封裝敏晤。開發(fā)中安卓和iOS要分別引入JsBridge或者WebViewJavascriptBridge,Native這邊代碼參照官上面的github地址的代碼去配置缅茉,下面我僅以前端的角度來講解如何用代碼去實(shí)現(xiàn):
① ?首先安卓嘴脾、iOS、web前端三方要在一起定義好需要使用的接口的方法名及傳遞的參數(shù)蔬墩,三方統(tǒng)一译打,由于h5這邊是要實(shí)現(xiàn)一套代碼和Native兩方通信,所以如果可以的話由前端來定義各個(gè)方法及傳遞的方式拇颅,原則上來說扶平,web前端這邊是作為需求方的,我們定義好方法iOS和安卓設(shè)置此方法讓我們調(diào)用蔬蕊。(當(dāng)然我們也可以注冊(cè)方法结澄,讓Native來調(diào)用我們的方法)

②iOS和安卓端的代碼不羅列,基本思路就是他們要用registerHandler注冊(cè)一個(gè)方法岸夯,js這邊通過callHandler來調(diào)用這個(gè)方法麻献,同時(shí)js這邊也可以用registerHandler注冊(cè)一個(gè)方法,Native端通過callHandler來調(diào)用猜扮。下面的代碼以我用的react框架來寫勉吻。
特別說明一下
:js中與Native通信的所有方法的注冊(cè)和調(diào)用都必須包裹在下圖的setupWebVie wJavascriptBridge函數(shù)里面。


前端和Native通信方法外層包裹的固定代碼



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旅赢,一起剝皮案震驚了整個(gè)濱河市齿桃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煮盼,老刑警劉巖短纵,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異僵控,居然都是意外死亡香到,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悠就,“玉大人千绪,你說我怎么就攤上這事」Fⅲ” “怎么了荸型?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)炸茧。 經(jīng)常有香客問我瑞妇,道長(zhǎng),這世上最難降的妖魔是什么宇立? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任踪宠,我火速辦了婚禮自赔,結(jié)果婚禮上妈嘹,老公的妹妹穿的比我還像新娘。我一直安慰自己绍妨,他們只是感情好润脸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著他去,像睡著了一般毙驯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灾测,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天爆价,我揣著相機(jī)與錄音,去河邊找鬼媳搪。 笑死铭段,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秦爆。 我是一名探鬼主播序愚,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼等限!你這毒婦竟也來了爸吮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤望门,失蹤者是張志新(化名)和其女友劉穎形娇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筹误,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埂软,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勘畔。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡所灸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炫七,到底是詐尸還是另有隱情爬立,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布万哪,位于F島的核電站侠驯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奕巍。R本人自食惡果不足惜吟策,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望的止。 院中可真熱鬧檩坚,春花似錦、人聲如沸诅福。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氓润。三九已至赂乐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咖气,已是汗流浹背挨措。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崩溪,地道東北人浅役。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悯舟,于是被迫代替她去往敵國(guó)和親担租。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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