native與H5交互方法

1.url的認識

在談到native與H5交互的時候尿扯,我們先要了解URL狡逢,剛入門的同學颖变,不太了解URL怎么去拆分咸产,下面先拿簡書http://www.reibang.com/recommendations/notes?category_id=56(協(xié)議://主機:端口/路徑?字段#片段盖高,scheme://host:port/path?query#fragment)這個URL來解釋:

http是協(xié)議(URL.scheme)慎陵,www.reibang.com為主機(URL.host)眼虱,recommendations/notes為路徑(URL.path),category_id=56為字段query(片段fragment省略)席纽;

2.了解了URL后捏悬,我們與H5制定一個協(xié)議,通過截取URL里面的字段润梯,來觸發(fā)這個協(xié)議方法:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

H5 loading幾個URL过牙,就會加載幾次。

3.(1) 包括第三方纺铭,所有H5調native的方法寇钉,都是通過攔截的方式;

比如點擊H5里面的某個按鈕舶赔,H5調native扫倡,其實就是觸發(fā)加載這個網(wǎng)頁,攔截到后竟纳,然后native自己實現(xiàn)方法撵溃;

(2) native點擊觸發(fā)H5的方法為:[self.webView stringByEvaluatingJavaScriptFromString:@“hide()”];其中“hide()”是H5那邊的方法。

stringByEvaluatingJavaScriptFromString

(1). js調native的方法:
原理也是攔截URL锥累,只需告訴Js調@"ObjC Echo”這個方法就可以:[self.bridge registerHandler:@"ObjC Echo" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"ObjC Echo called with: %@", data);
responseCallback(data);
}];

(2). native調js的方法:
[self.bridge callHandler:@"JS Echo" data:nil responseCallback:^(id responseData) {這個方法等同原生方法[self.webView stringByEvaluatingJavaScriptFromString:@"JS Echo"];

4. WebViewJavascriptBridge

一開始缘挑,我們在Native端和JS端都分別進行初始化
OC端:

@property WebViewJavascriptBridge* bridge;

對應的初始化代碼如下,在初始化中直接包含了一個用于接收JS的回調:

_bridge = [WebViewJavascriptBridge bridgeForWebView:webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {  

        NSLog(@"ObjC received message from JS: %@", data);

        responseCallback(@"Response for message from ObjC");

}];

JS端:(以下是固定寫法揩悄,你自己的JS文件中必須包含如下代碼)

function connectWebViewJavascriptBridge(callback) {  

    if (window.WebViewJavascriptBridge) {

        callback(WebViewJavascriptBridge)

    } else {

        document.addEventListener('WebViewJavascriptBridgeReady',   function() {

            callback(WebViewJavascriptBridge)

        }, false)

    }

}

connectWebViewJavascriptBridge(function(bridge) {  

    bridge.init(function(message, responseCallback) {

        log('JS got a message', message)

        var data = { 'Javascript Responds':'Wee!' }

        log('JS responding with', data)

        responseCallback(data)

    })

}

在JS中如果調用了bridge.send()卖哎,那么將觸發(fā)OC端_bridge初始化方法中的回調。
同理删性,第二條亏娜,在JS中調用了bridge.callHandler('testJavascriptHandler'),它將觸發(fā)OC端注冊的同名方法:
js中的代碼

bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
            log('ObjC called testJavascriptHandler with', data)
            var responseData = { 'Javascript Says':'Right back atcha!' }
            log('JS responding with', responseData)
            responseCallback(responseData)
        })

        document.body.appendChild(document.createElement('br'))

        var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button'))
        callbackButton.innerHTML = 'Fire testObjcCallback'
        callbackButton.onclick = function(e) {
            e.preventDefault()
            log('JS calling handler "testObjcCallback"')
            bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) {
                log('JS got response', response)
            })
        }

OC中的代碼

web端調用:
WVJB RCVD -> block內(nèi)部-> 再block內(nèi)部回調回web 用WVJB SEND(如果沒有回調就沒有SEND)

    [_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"testObjcCallback called: %@", data);
        responseCallback(@"Response from testObjcCallback");
    }];

web端代碼:
        var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button'))
        callbackButton.innerHTML = 'Fire testObjcCallback'
        callbackButton.onclick = function(e) {
            e.preventDefault()
            log('JS calling handler "testObjcCallback"')
            bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) {
                log('JS got response', response)
            })
        }
    })


客戶端調用:: WVJB SEND ->WVJB RCVD - >block回調

    [_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];

然后web端代碼:
bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
            log('ObjC called testJavascriptHandler with', data)
            var responseData = { 'Javascript Says':'Right back atcha!' }
            log('JS responding with', responseData)
            responseCallback(responseData)
        })

第三方WebViewJavascriptBridge框架網(wǎng)址:http://www.cnblogs.com/jiang-xiao-yan/p/5345755.html或者http://www.cocoachina.com/ios/20150629/12248.html

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹬挺,一起剝皮案震驚了整個濱河市维贺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巴帮,老刑警劉巖溯泣,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榕茧,居然都是意外死亡垃沦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門用押,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肢簿,“玉大人,你說我怎么就攤上這事〕爻洌” “怎么了桩引?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長收夸。 經(jīng)常有香客問我坑匠,道長,這世上最難降的妖魔是什么卧惜? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任厘灼,我火速辦了婚禮,結果婚禮上序苏,老公的妹妹穿的比我還像新娘手幢。我一直安慰自己,他們只是感情好忱详,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跺涤,像睡著了一般匈睁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桶错,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天航唆,我揣著相機與錄音,去河邊找鬼院刁。 笑死糯钙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的退腥。 我是一名探鬼主播任岸,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狡刘!你這毒婦竟也來了享潜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嗅蔬,失蹤者是張志新(化名)和其女友劉穎剑按,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澜术,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡艺蝴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸟废。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猜敢。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锣枝,到底是詐尸還是另有隱情厢拭,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布撇叁,位于F島的核電站供鸠,受9級特大地震影響,放射性物質發(fā)生泄漏陨闹。R本人自食惡果不足惜楞捂,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趋厉。 院中可真熱鬧寨闹,春花似錦、人聲如沸君账。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乡数。三九已至椭蹄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間净赴,已是汗流浹背绳矩。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玖翅,地道東北人翼馆。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像金度,于是被迫代替她去往敵國和親应媚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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