創(chuàng)建 Bridge
+ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView;
并且設(shè)置 Bridge 為 webview 和 bridgebase 的代理
OC 調(diào)用 JS
1. OC 傳入方法名 handlerName 和 data(參數(shù)),JS 返回 responseCallback
使用數(shù)組把 handlerName 和參數(shù) data 放入字典中
使用
- (void)callHandler:(NSString *)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback
e.g.
x
[bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
// you can do something here
}
然后在JS 端注冊(cè)同名的function 以testJavascriptHandler 為例
bridge.registerHandler('testJavascriptHandler',function(data, responseCallback) {
// you can do something here }
)
原理
js 已經(jīng)注冊(cè)了 以methodName 為表示的方法 OC通過(guò)
[_webView stringByEvaluatingJavaScriptFromString:javascriptCommand];
來(lái)執(zhí)行JS語(yǔ)句
JS調(diào)用OC語(yǔ)句
OC注冊(cè)一個(gè)橋接
[_bridge registerHandler:@"myHander" handler:^(id data, WVJBResponseCallback responseCallback) {
// you can do something here
}];
參數(shù)有 HanderName 還有 回調(diào) 和 嵌套回調(diào)
js執(zhí)行某個(gè)方法
bridge.callHandler('myHander',{'foo':'bar'},function(response){
// you can do something here
})
Javascript調(diào)用OC 使用的是 HanderName 對(duì)應(yīng)特定 Block 塊(Object)
原理
1、監(jiān)聽
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
方法
2、截獲request的URL
NSURL *url = [request URL];
-(BOOL)isCorrectProcotocolScheme:(NSURL*)url {
if([[url scheme] isEqualToString:kCustomProtocolScheme]){
return YES;
} else {
return NO;
}
}
-(BOOL)isQueueMessageURL:(NSURL*)url {
if([[url host] isEqualToString:kQueueHasMessage]){
return YES;
} else {
return NO;
}
}