H5與原生交互 記錄踩坑

目前H5與原生交互的主要方式:

攔截Webview請求的URL Schema

URL Schema是類URL的一種請求格式怒炸,可以自定義JSBridge通信的URL Schema阿迈,比如:jsbridge://showToast?text=hello ,Native對符合約定的URL進(jìn)行解析断盛,拿到相關(guān)操作、操作愉舔,進(jìn)而調(diào)用原生Native的方法钢猛,主要有:

  • a標(biāo)簽

  • location.href

  • 使用iframe.src

  • 發(fā)送ajax請求
    但是,a標(biāo)簽需要用戶操作轩缤;location.href可能會引起頁面的跳轉(zhuǎn)丟失調(diào)用命迈;發(fā)送ajax請求Android沒有相應(yīng)的攔截方法;所以使用iframe.src是比較好的方案火的。

    總結(jié):針對這種攔截Webview請求的URL Schema的交互方式壶愤,雖然兼容性還行,但是基于URL的方式馏鹤,長度受到限制而且不太直觀征椒,數(shù)據(jù)格式有限制,而且建立請求有時間耗時湃累。

JavascriptInterface

//對應(yīng)安卓端 android為原生自定義
javascript:android.getSomething()   
//對應(yīng)ios端 h5向原生發(fā)送消息msg
window.webkit.messageHandlers.getSomething.postMessage(msg)
//注冊供原生調(diào)用返回參數(shù)的方法
window.getSomething =(result)=>{
  console.log('原生給H5的數(shù)據(jù)內(nèi)容',result)
}

jsbridge

//定義與初始化 jsbridge.js
       //注冊事件監(jiān)聽勃救,初始化
       function setupWebViewJavascriptBridge(callback) {
            if(isAndroid){
                 if (window.WebViewJavascriptBridge) {
                       callback(WebViewJavascriptBridge)
                 } else {
                     document.addEventListener(
                       'WebViewJavascriptBridgeReady'
                         , function() {
                         callback(WebViewJavascriptBridge)
                     },
                     false
                     );
                 }
           } 
        if(isIos){
          if (window.WebViewJavascriptBridge) { 
            return callback(window.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);
        }
       }

       //回調(diào)函數(shù),接收數(shù)據(jù)
    if(isAndroid) setupWebViewJavascriptBridge(function(bridge) {
           //默認(rèn)接收  安卓原生初始化
        bridge.init(function(message, responseCallback) {
               var responseData = 'js默認(rèn)接收完畢治力,并回傳數(shù)據(jù)給java';
               responseCallback(responseData); //回傳數(shù)據(jù)給java
           });

           //注冊接收參數(shù)functionInJs名稱 與原生保持一致
         //  bridge.registerHandler("functionInJs", function(data, responseCallback) {
             //  console.log('接收到的數(shù)據(jù)',data);
             //  var responseData = 'js指定接收完畢蒙秒,并回傳數(shù)據(jù)';
             //  responseCallback(responseData); //回傳數(shù)據(jù)
        //  });
       })

調(diào)用jsbridge

window.setupWebViewJavascriptBridge(bridge => {
// '原生函數(shù)名', "傳給原生端的數(shù)據(jù)", callback 回調(diào)函數(shù)
    bridge.callHandler('getSomething', data, (result) => {
        console.log(result);
    });
})

坑點:Android頁面首次調(diào)用jsbridge時,返回較慢宵统,后續(xù)返回正常晕讲,暫未找出原因

  • 補(bǔ)充,第三種方式榜田,使用阿里的離線包容器(mPaaS離線包
    益兄,需端上配合),調(diào)用AlipayJSBridge箭券,使用方式同jsbridge,詳情可以查看官方文檔 支付寶H5開放文檔疑枯,目前坑點是ios的導(dǎo)航欄左上按鈕返回back事件定義不生效辩块,需端上配合設(shè)置
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荆永,隨后出現(xiàn)的幾起案子废亭,更是在濱河造成了極大的恐慌,老刑警劉巖具钥,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豆村,死亡現(xiàn)場離奇詭異,居然都是意外死亡骂删,警方通過查閱死者的電腦和手機(jī)掌动,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門四啰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粗恢,你說我怎么就攤上這事柑晒。” “怎么了眷射?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵匙赞,是天一觀的道長。 經(jīng)常有香客問我妖碉,道長涌庭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任欧宜,我火速辦了婚禮坐榆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鱼鸠。我一直安慰自己猛拴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布蚀狰。 她就那樣靜靜地躺著愉昆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麻蹋。 梳的紋絲不亂的頭發(fā)上跛溉,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機(jī)與錄音扮授,去河邊找鬼芳室。 笑死,一個胖子當(dāng)著我的面吹牛刹勃,可吹牛的內(nèi)容都是我干的堪侯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荔仁,長吁一口氣:“原來是場噩夢啊……” “哼伍宦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乏梁,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤次洼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后遇骑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卖毁,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年落萎,在試婚紗的時候發(fā)現(xiàn)自己被綠了亥啦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炭剪。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖禁悠,靈堂內(nèi)的尸體忽然破棺而出念祭,到底是詐尸還是另有隱情,我是刑警寧澤碍侦,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布粱坤,位于F島的核電站,受9級特大地震影響瓷产,放射性物質(zhì)發(fā)生泄漏站玄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一濒旦、第九天 我趴在偏房一處隱蔽的房頂上張望株旷。 院中可真熱鬧,春花似錦尔邓、人聲如沸晾剖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齿尽。三九已至,卻和暖如春灯节,著一層夾襖步出監(jiān)牢的瞬間循头,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工炎疆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留卡骂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓形入,卻偏偏與公主長得像全跨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子亿遂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

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