第三方插件 WebJavascriptBridge 可以方便实现oc与js的交互
首先,要在控制器的.h文件当中实现浏览器控件的协议<UIWebViewDelegate>,在.m方法当中,WebViewJavascriptBridge并没有直接复写代理方法,而是这样实现的:
先声明一个对象
@property WebViewJavascriptBridge* _bridge;
<pre name="code" class="objc"><pre name="code" class="objc" style="color: rgb(70, 70, 70); line-height: 18px;">- (void)viewDidLoad {
UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
[self.view addSubview:webView];
//开启调试信息 [WebViewJavascriptBridge enableLogging]; //响应JS通过send发送给OC的消息 _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通过callhandler发送给OC的消息 [_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) { NSLog(@"testObjcCallback called: %@", data); responseCallback(@"Response from testObjcCallback"); }];}
这个框架定义了两种OC和JS之间通信的方式,一种是send,发送一条消息,另一种是通过一个key调用callHandler,注意上方红色的方法,这两个方法接收js返回回来的data并显示,之后调用那个了responseCallback方法,给js回发一条消息,也就是回调。
OC可以相应JS发来的消息,也可以主动给JS发消息,Demo当中提取了两个方法:
1 //OC调用send给JS发消息 2 - (void)sendMessage:(id)sender { 3 [_bridge send:@"A string sent from ObjC to JS" responseCallback:^(id response) { 4 NSLog(@"sendMessage got response: %@", response); 5 }]; 6 } 7 8 //OC调用callHandler给JS发消息 9 - (void)callHandler:(id)sender { 10 id data = @{ @"greetingFromObjC": @"Hi there, JS!" }; 11 [_bridge callHandler:@"testJavascriptHandler" data:data responseCallback:^(id response) { 12 NSLog(@"testJavascriptHandler responded: %@", response); 13 }]; 14 }