WKWebViewJavascriptBridge坑-剛注冊bridge失效問題,調(diào)方法失效

本文不是介紹WebViewJavascriptBridge怎么使用的文章伊者,需要了解可以去參考Github上的Demo

本文主要解決h5端在setupWebViewJavascriptBridge之后調(diào)用客戶端方法刀脏,有一段時間不生效的問題。之前的我們h5端的解決方案是在方法調(diào)用的時候加400ms左右的延遲颗品,后來發(fā)現(xiàn)有些安卓機型即使加了400ms的延遲依然無法調(diào)起客戶端的方法苍碟,到此發(fā)現(xiàn)延時調(diào)用這個事情不靠譜,遂尋找更好的解決方案稠集。

這時候去看了WebViewJavascriptBridge的源碼,發(fā)現(xiàn)無論是安卓還是iOS在setup的時候都會進行一系列注冊方法以及WebViewJavascriptBridge掛載到window對象下面饥瓷,只不過在掛載的過程中iOS更快剥纷,安卓比較慢見下圖對比:

iOS

安卓

第一個日期打印的是我調(diào)用客戶端方法的時間,第二個是當(dāng)WebViewJavascriptBridge掛載完成的時間呢铆。iOS只需要幾到十幾ms晦鞋,但是安卓比較好的機型也需要150ms以上,更差的機器400ms以上這就解釋了為什么有的安卓手機延時不生效的原因棺克。這是內(nèi)核的差異產(chǎn)生的悠垛,假如我們要用這個類庫就要沒辦法繞開這一步。
這個時候我就去翻了官方給的demo,發(fā)現(xiàn)這個庫是ios專有庫娜谊,并沒有安卓版本确买,應(yīng)該是哪個大佬仿寫了一套安卓的庫,因為太像了所以大家以為是一家的纱皆,ios類庫給的html端使用方法如下:

  setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    let WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'https://__bridge_loaded__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe); }, 0);
  }
  //在html頁面調(diào)用
  setupWebViewJavascriptBridge((bridge) => {
    //someCode();
  });

安卓端給的html頁面的demo如下:

        function setupWebViewJavascriptBridge(callback) {
             if (window.WebViewJavascriptBridge) {
                callback(WebViewJavascriptBridge)
            } else {
                document.addEventListener(
                    'WebViewJavascriptBridgeReady'
                    , function() {
                        callback(WebViewJavascriptBridge)
                    },
                    false
                );
            }

  //在html頁面調(diào)用
  setupWebViewJavascriptBridge((bridge) => {
    //someCode();
  });

看到這里不知道大家有沒有看明白湾趾,兩端bridge掛在成功之后,ios是通過執(zhí)行回調(diào)函數(shù)通知h5派草,安卓是通過發(fā)一個WebViewJavascriptBridgeReady事件搀缠,我們必須監(jiān)聽這個事件才能知道什么時候執(zhí)行,具體使用大家可以參考Android 和 IOS 使用 WebViewJavascriptBridge 進行交互方法

還有一種方法通過修改源碼統(tǒng)一兩端處理方法,在安卓端搜索WebViewJavascriptBridgeReady加上callback的回調(diào)澳眷,整個代碼如下:

  var doc = document;
    _createQueueReadyIframe(doc);
    _createQueueReadyIframe4biz(doc);
    var readyEvent = doc.createEvent('Events');
    readyEvent.initEvent('WebViewJavascriptBridgeReady');
    readyEvent.bridge = WebViewJavascriptBridge;
    doc.dispatchEvent(readyEvent);
    //安卓端需要添加如下代碼
    setTimeout(_callWVJBCallbacks, 0);
    function _callWVJBCallbacks() {
        var callbacks = window.WVJBCallbacks;
        delete window.WVJBCallbacks;
        for (var i=0; i<callbacks.length; i++) {
            callbacks[i](WebViewJavascriptBridge);
        }
    }

此時修改h5端代碼,由于都添加了callback回調(diào)的代碼胡嘿,所以只需要寫一套邏輯就可以了:

  setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    let WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'https://__bridge_loaded__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe); }, 0);
  }
  //在html頁面調(diào)用
  setupWebViewJavascriptBridge((bridge) => {
    //someCode();
  });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钳踊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勿侯,老刑警劉巖拓瞪,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異助琐,居然都是意外死亡祭埂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門兵钮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛆橡,“玉大人,你說我怎么就攤上這事掘譬√┭荩” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵葱轩,是天一觀的道長睦焕。 經(jīng)常有香客問我藐握,道長,這世上最難降的妖魔是什么垃喊? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任猾普,我火速辦了婚禮,結(jié)果婚禮上本谜,老公的妹妹穿的比我還像新娘初家。我一直安慰自己,他們只是感情好乌助,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布笤成。 她就那樣靜靜地躺著,像睡著了一般眷茁。 火紅的嫁衣襯著肌膚如雪炕泳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天上祈,我揣著相機與錄音培遵,去河邊找鬼。 笑死登刺,一個胖子當(dāng)著我的面吹牛籽腕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纸俭,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼皇耗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揍很?” 一聲冷哼從身側(cè)響起郎楼,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窒悔,沒想到半個月后呜袁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡简珠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年阶界,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聋庵。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡膘融,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祭玉,到底是詐尸還是另有隱情氧映,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布攘宙,位于F島的核電站屯耸,受9級特大地震影響拐迁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疗绣,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一线召、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧多矮,春花似錦缓淹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至湾盗,卻和暖如春伏蚊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背格粪。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工躏吊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帐萎。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓比伏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疆导。 傳聞我的和親對象是個殘疾皇子赁项,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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