目的
掌握
- OC 調(diào)用 JS方法
- JS 調(diào)用 OC方法
- OC——>sender
- JS——> sender
OC 調(diào)用 JS方法
OC代碼
[_bridge callHandler:@"testJavascriptHandler" data:data responseCallback:^(id response) {
NSLog(@"testJavascriptHandler responded: %@", response);
}];
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)//調(diào)用OC中的responseCallback,Bolock,responseData是傳遞給回調(diào)的參數(shù)
})
分析:
在JS中注冊了一個方法,叫做testJavascriptHandler凿叠,OC中想要調(diào)用JS中的testJavascriptHandler方法告材,所以在OC中調(diào)用callHandler方法园欣,其中data是參數(shù),類型是JSON(NSDictionary),
responseCallback是回調(diào),至于回調(diào)是否被調(diào)起取決與JS中是否調(diào)用。
JS方法 調(diào)用 OC方法
JS代碼
callbackButton.onclick = function(e) {
e.preventDefault()
log('JS calling handler "testObjcCallback"')
bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) {
log('JS got response', response)
})
}
OC代碼
[_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"testObjcCallback called: %@", data);
responseCallback(@"Response from testObjcCallback");
}];
分析
Web頁面上有一個按鈕抡笼,點擊這個按鈕想調(diào)用OC提供的一個方法,所以在OC中registerHandler(注冊了一個操作)叫做testObjcCallback黄鳍,當(dāng)被JS調(diào)用的時候會響應(yīng)handler Block中的代碼推姻,responseCallback用來確定是否調(diào)用JS中的回調(diào)操作。
JS中框沟,Web頁面上的按鈕被點擊的時候藏古,調(diào)用 bridge.callHandler 傳入操作名,以及回調(diào)忍燥,就可以找到OC中的方法校翔。function(response)是調(diào)用OC方法之后的回調(diào)操作。
bridge來自何方
WebViewJavascriptBridge是一個Objective-C 與JavaScript 進行消息互通等第三方庫灾前。使用之前需要對其進行初始化防症。
Objective-C初始化
_bridge = [WebViewJavascriptBridge bridgeForWebView:webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"ObjC received message from JS: %@", data);
responseCallback(@"Response for message from ObjC");
}];
這是使用類方法創(chuàng)建一個WebViewJavascriptBridge對象。其中有一個block類型的handle。這個handle主要是用來接收J(rèn)avaScript里面通過send方法傳過來的消息的蔫敲,這里的handle里面的參數(shù)與JavaScript中send方法里面的參數(shù)對應(yīng)饲嗽。
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)
})
});
這里初始化先是創(chuàng)建了一個connectWebViewJavascriptBridge方法,該方法注冊了一個WebViewJavascriptBridgeReady事件奈嘿,同時聲明了一個全局的WebViewJavascriptBridge變量貌虾。我們可以在外部通過WebViewJavascriptBridge調(diào)用相關(guān)方法。
在init里面同樣有一個function裙犹,這個function同樣是用來接收Objective-C里面通過send方法發(fā)送的消息的尽狠,參數(shù)與OC里的send方法參數(shù)對應(yīng)
OC——>sender
[_bridge send:@"A string sent from ObjC before Webview has loaded." responseCallback:^(id responseData) {
NSLog(@"objc got response! %@", responseData);
}];
這個send方法,實際上是調(diào)用了JavaScript初始化init里面的function
JS——>sender
bridge.send(data, function(responseData) {
log('JS got response', responseData)
});
這種方式發(fā)送消息實際上是調(diào)用了OC初始化時的handle
注:
以上方法大部分都包含沒有callback的方法叶圃“栏啵可以再頭文件中找到;
github上有代碼示例。
參考資料
https://github.com/marcuswestin/WebViewJavascriptBridge