混合開發(fā)H5通信方案

現(xiàn)在锅睛,混合開發(fā)是APP的主流開發(fā)模式——NATIVE+H5。金科支持的各site也是采取同樣的做法义辕∠罕辏混合開發(fā)的優(yōu)點(diǎn)很多,百度一下就知道灌砖,不是本文的重點(diǎn)璧函。這里簡(jiǎn)單介紹下hyperion的工作原理,重點(diǎn)分析億賬通運(yùn)營(yíng)服務(wù)小組現(xiàn)在使用的方案——H5框架里面耳熟能詳?shù)膬蓚€(gè)hyperion JS文件走讀下代碼基显。

大綱:

一 背景介紹

二 hyperion.adapert.js

? ?2.1 如何交互

? ?2.2 代碼走讀

? ?2.3 目前遇到情況蘸吓,Android/iOS ?對(duì)接目前的問題

三 hyperion.js 新增配置


一 背景介紹

? ? 由于APP和H5各自的優(yōu)勢(shì)劣勢(shì),混合開發(fā)能彌補(bǔ)APP打包撩幽、審核库继、發(fā)布耗時(shí)長(zhǎng),也解決了H5不能調(diào)用系統(tǒng)接口的局限窜醉。兩者的結(jié)合既保留APP的性能優(yōu)勢(shì)宪萄,也充分發(fā)揮H5的跨平臺(tái)性,這種方式也被很多業(yè)內(nèi)知名的互聯(lián)網(wǎng)公司采用榨惰,如淘寶拜英、京東、微信公眾號(hào)琅催,包括平安集團(tuán)的大多數(shù)APP也采用混合開發(fā)的模式居凶。

? ? 有了混合App(Hybrid App)的誕生,那么NATIVE和H5是如何進(jìn)行交互的藤抡,需要我們做哪些事情侠碧,是想要在這篇文章說明的重點(diǎn)。

二 hyperion.adapert.js

? ? ?2.1 交互原理

混合APP需要開啟webview的功能缠黍,并且在webview加載H5頁面的時(shí)候需要注入js腳本弄兜。通過類似iframe、prompt、alert挨队、confirm等方法和webview交互,webview能監(jiān)聽到j(luò)s的事件拿到所傳輸?shù)臄?shù)據(jù)蒿往,在進(jìn)行處理后返回接觸的結(jié)果數(shù)據(jù)告訴H5執(zhí)行的回調(diào)盛垦。總結(jié)起來就是下圖示意:

2.1H5-NATIVE交互

2.2 hyperion.adapert.js

? ? 這個(gè)文件是定義H5和NATIVE交互的方法瓤漏。文件可以分成兩個(gè)部分腾夯,下面的一段(function(global){})(this)自執(zhí)行函數(shù),和上面的定義全局變量HFEasyJS蔬充。(本人不太明白IOS和JAVA開發(fā)蝶俱,僅從H5的角度來分析代碼的邏輯,說的不全的地方請(qǐng)大家留言指正饥漫。)

? ? (function(global){})(this)里面干了兩件事情榨呆。一是定義了Hyperion的方法,其中一個(gè)屬性Hyperion.call傳參給native庸队,另一個(gè)Hyperion._callback處理JS回調(diào)积蜻。JS自身并不清楚回調(diào)要什么時(shí)候來觸發(fā),所以其實(shí)這里的Hyperion._callback的觸發(fā)是native端來調(diào)起的彻消。查閱Android端的回調(diào)代碼:

jsContent = "javascript:Hyperion._callback('" + callBackFunName + "'," + callBackCode + ","+ callBackParam + ")";

... ?

?loadUrl(jsContent);

...

找到傳過去的callBackFunName竿拆,調(diào)起已注入JS的代碼,并在webview里面執(zhí)行宾尚。

? ? H5的框架我們默認(rèn)一定要引入hyprion.adapte.js和hyperion.js兩個(gè)腳本文件丙笋,但是在調(diào)試Android端的時(shí)候發(fā)現(xiàn),hyprion.adapte.js其實(shí)是有注入進(jìn)webview的煌贴,就是我們實(shí)際上調(diào)起的Hyperion方法是覆蓋了腳本文件用的Android端的腳本:

public static String getCommonInjectedJS(){

return "javascript:(function(Global){var Hyperion=Global.Hyperion||{};var slice=Array.prototype.slice,ua=Global.navigator?Global.navigator.userAgent:\"\",isiOS=/iPhone|iPad|iPod|iOS/i.test(ua),isAndroid=/Android/i.test(ua),callbackId=0;var noop=function(){}; ...略

}

確實(shí)看起來和我們hyprion.adapte.js很像御板,但是還少了一部分代碼,因?yàn)锳ndroid端到這里已經(jīng)結(jié)束了崔步。在Hyprion.call里面有別與Android和IOS的部分:

if (isAndroid) {

prompt(callData);

} else if (isiOS) {

try {

global.Hyperion_NATIVE.call(callData);

} catch (e) {}

}

對(duì)照?qǐng)D2.1來理解稳吮,Android端用了prompt的方法和webview進(jìn)行傳參,但是IOS用了另一種方式iframe井濒,就是Hyperion.adapte.js的上面部分定義的HFEasyJS灶似。(為什么不能用一個(gè)方法來傳值了,還區(qū)分平臺(tái)瑞你,這個(gè)已經(jīng)無從考證酪惭,是歷史代碼原因還是平臺(tái)版本的兼容性問題有了解更多的大神歡迎指導(dǎo)留言)

window.HFEasyJS = {

__callbacks: {},

invokeCallback: function(cbID, removeAfterExecute) {

...

},

call: function(obj, functionName, args) {

...

var iframe = document.createElement("IFRAME");

iframe.setAttribute("src", "easy-js:" + obj + ":" + encodeURIComponent(functionName) + argStr);

},

inject: function(obj, methods) {

for (var i = 0, l = methods.length; i < l; i++) {

jsObj[jsMethod] = function() {

return HFEasyJS.call(obj, method, Array.prototype.slice.call(arguments));

?}}};

IOS用iframe進(jìn)行傳值,在document內(nèi)append(iframe)的時(shí)候會(huì)把參數(shù)拼接成字符串通過src進(jìn)行傳值例: ?src:'easy-js:Hyperion_NATIVE:call:'者甲,NATIVE在接收到定義的協(xié)議后并不去請(qǐng)網(wǎng)絡(luò)資源春感,而是解析傳入的方法。

2.3 目前遇到情況,Android/iOS? 對(duì)接目前的問題

? ? 定義接口的文件綜上所述鲫懒。發(fā)現(xiàn)Android和IOS都有注入hyperion.adapter.js嫩实,而且H5在框架層也引入了此文件。注入的原因可能是為了解決加載H5資源過多窥岩,但是也會(huì)存在注入時(shí)機(jī)的問題甲献,如果頁面初始化的需要調(diào)用例如Hyperion.actions.onEvent()的方法,注入腳本是在靜態(tài)資源加載完成時(shí)颂翼,那么就會(huì)導(dǎo)致找不到方法報(bào)錯(cuò)晃洒。可能NATIVE有多次注入朦乏,其實(shí)為了防止報(bào)錯(cuò)的問題球及,H5的框架保險(xiǎn)起見再次引入了hyperion.adapter.js。那初衷為了減少請(qǐng)求開支的目的也沒用達(dá)到呻疹,而且如果協(xié)議文件改了Android和IOS都要改腳本并且打包吃引,(用了這么久應(yīng)該也不會(huì)改了吧,實(shí)際上卻是碰到了問題刽锤,需要改動(dòng)native端的腳本)所以的site也要更新代碼际歼,搞得挺麻煩,H5來維護(hù)更方便姑蓝。

三 hyperion.js 新增配置

相對(duì)來說hyperion.js更容易理解鹅心,其實(shí)就是封裝的各個(gè)方法,其中Hyperion 文檔有介紹如何寫的比較詳細(xì)纺荧,這里就不贅述旭愧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宙暇,隨后出現(xiàn)的幾起案子输枯,更是在濱河造成了極大的恐慌,老刑警劉巖占贫,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桃熄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡型奥,警方通過查閱死者的電腦和手機(jī)瞳收,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厢汹,“玉大人螟深,你說我怎么就攤上這事√淘幔” “怎么了界弧?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵凡蜻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我垢箕,道長(zhǎng)划栓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任条获,我火速辦了婚禮茅姜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘月匣。我一直安慰自己,他們只是感情好奋姿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布锄开。 她就那樣靜靜地躺著,像睡著了一般称诗。 火紅的嫁衣襯著肌膚如雪萍悴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天寓免,我揣著相機(jī)與錄音癣诱,去河邊找鬼。 笑死袜香,一個(gè)胖子當(dāng)著我的面吹牛撕予,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜈首,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼实抡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了欢策?” 一聲冷哼從身側(cè)響起吆寨,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踩寇,沒想到半個(gè)月后啄清,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俺孙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年辣卒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睛榄。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡添寺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出懈费,到底是詐尸還是另有隱情计露,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站票罐,受9級(jí)特大地震影響叉趣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜该押,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一疗杉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚕礼,春花似錦烟具、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至囤躁,卻和暖如春冀痕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狸演。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工言蛇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宵距。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓腊尚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親满哪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跟伏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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