OC與H5交互(WebViewJavascriptBridge)

雖然原生方法也可以滿足我們一些日常的OC與H5交互需求拭荤,但是一旦交互需求多了,代碼就會(huì)顯得很凌亂和松散躲胳;WebViewJavascriptBridge就為我們解決了這樣的問題,他可以很輕松簡(jiǎn)單的在OC和JS之間傳送消息揩瞪,還是可以方便的攜帶參數(shù)疹鳄,處理回調(diào)拧略,極大的提高了我們的開發(fā)效率。

首先不管你是手動(dòng)或是pods瘪弓,要先把WebViewJavascriptBridge集成到我們的工程里來垫蛆,然后倒入頭文件#import "WebViewJavascriptBridge.h"

OC部分準(zhǔn)備

  1. 創(chuàng)建WebViewJavascriptBridge的實(shí)例屬性
@property WebViewJavascriptBridge* bridge;
  1. 創(chuàng)建webView,然后與bridge綁定腺怯,并設(shè)置代理
    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:webView];
    
    _bridge = [WebViewJavascriptBridge bridgeForWebView:webView];
    [_bridge setWebViewDelegate:self];

JS部分準(zhǔn)備

  1. JS初始配置
function setupWebViewJavascriptBridge(callback) {
        if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
        if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
        window.WVJBCallbacks = [callback];
        var WVJBIframe = document.createElement('iframe');
        WVJBIframe.style.display = 'none';
        WVJBIframe.src = 'https://__bridge_loaded__';
        document.documentElement.appendChild(WVJBIframe);
        setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
    }
  1. 實(shí)現(xiàn)函數(shù)和回調(diào)
setupWebViewJavascriptBridge(function(bridge) {

        /* Initialize your app here */

        bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
            log('ObjC 傳來=', data)
            var responseData = { 'JS':'回調(diào)給OC' }
            log('JS 收到=', responseData)
            responseCallback(responseData)
        })

        bridge.callHandler('testObjcCallback', {'來自JS': 'hello OC'}, function(response) {
            log('JS 收到回調(diào)=', response)
        }
})

調(diào)用

  1. JS調(diào)用OC
    [_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"testObjcCallback方法被調(diào)用了袱饭,參數(shù): %@", data);
        responseCallback(@"通知JS收到消息");
    }];

在OC中注冊(cè)JS的testObjcCallback的方法監(jiān)聽,當(dāng)JS的testObjcCallback函數(shù)被調(diào)用后呛占,我們就會(huì)在上邊拿到回調(diào)以及參數(shù)虑乖,并且可以用responseCallback()回調(diào)給JS。

  1. OC調(diào)用JS
    id data = @{ @"來自O(shè)C": @"hello JS" };
    [_bridge callHandler:@"testJavascriptHandler" data:data responseCallback:^(id response) {
        NSLog(@"testJavascriptHandler 收到了: %@", response);
    }];

當(dāng)我們?cè)贠C中通過callHandler方法調(diào)用JS的testJavascriptHandler函數(shù)栓票,在JS中該函數(shù)就會(huì)被調(diào)用决左,并把參數(shù)傳遞過去愕够。

總結(jié)

WebViewJavascriptBridge可以很靈活實(shí)在OC和JS的調(diào)用和傳參走贪,而且每個(gè)方法單獨(dú)注冊(cè)回調(diào),代碼很清晰惑芭。而且api簡(jiǎn)單易上手坠狡,學(xué)習(xí)成本不高,可以為你解決ios原生方法里那些多重判斷帶來的代碼臃腫遂跟、邏輯混亂逃沿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市幻锁,隨后出現(xiàn)的幾起案子凯亮,更是在濱河造成了極大的恐慌,老刑警劉巖哄尔,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件假消,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡岭接,警方通過查閱死者的電腦和手機(jī)富拗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸣戴,“玉大人啃沪,你說我怎么就攤上這事≌” “怎么了创千?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我追驴,道長(zhǎng)寓涨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任氯檐,我火速辦了婚禮戒良,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冠摄。我一直安慰自己糯崎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布河泳。 她就那樣靜靜地躺著沃呢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拆挥。 梳的紋絲不亂的頭發(fā)上薄霜,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼乌叶。 笑死塔鳍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崎坊。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼洲拇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奈揍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赋续,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤男翰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纽乱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾绎,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年迫淹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秘通。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敛熬,死狀恐怖肺稀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情应民,我是刑警寧澤话原,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布夕吻,位于F島的核電站,受9級(jí)特大地震影響繁仁,放射性物質(zhì)發(fā)生泄漏涉馅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一黄虱、第九天 我趴在偏房一處隱蔽的房頂上張望稚矿。 院中可真熱鬧,春花似錦捻浦、人聲如沸晤揣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昧识。三九已至,卻和暖如春盗扒,著一層夾襖步出監(jiān)牢的瞬間跪楞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工侣灶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸祭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓炫隶,卻偏偏與公主長(zhǎng)得像淋叶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伪阶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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