OC与 JS交互方式
1.通过拦截URL(适用于UIWebView和WKWebView)
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *url = request.URL.absoluteString; if ([url rangeOfString:@"需要跳转源生界面的URL判断"].location != NSNotFound) { //跳转原生界面 return NO; } return YES; }
2.JS调用OC代码(messageHander)
- window.webkit.messageHandlers.<方法名>.postMessage(<数据>)
//JS执行window.webkit.messageHandlers.Share.postMessage(<messageBody>) function shareClick() { window.webkit.messageHandlers.Share.postMessage({title:'测试分享的标题',content:'测试分享的内容',url:'https:baidu.com'}); }
- 那么在OC中的处理方法如下.它是WKScriptMessageHandler的代理方法.name和上方JS中的方法名相对应
[userContentController addScriptMessageHandler:self name:@"Share"];
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { //JS调用OC方法 //message.boby就是JS里传过来的参数 NSLog(@"body:%@",message.body); if ([message.name isEqualToString:@"Share"]) { [self ShareWithInformation:message.body]; } }
3.JavaScriptCore (UIWebView)
<html> <head> </head> <body> <script> function buttonClick1() { // 方法一 var token = getMessage(); alert(token) } function buttonClick2() { // 方法二 var token = JavaScriptInterface.tipMessage(); alert(token) } </script> <button id="abc" onclick="buttonClick1()">function 1</button> <button id="abcd" onclick="buttonClick2()">function 2</button> </body </html>
-(void)webViewDidFinishLoad:(UIWebView *)webView { self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // 方法一 __weak typeof(self) weakSelf = self; self.jsContext[@"getMessage"] = ^(){ return [weakSelf blockCallMessage]; }; // 方法二 self.jsContext[@"JavaScriptInterface"] = self; //OC调用js NSString *runJS = @"执行的JS代码"; //准备执行的JS代码 [self.jsContext evaluateScript:runJS]; }
4.使用三方库WebViewJavascriptBridge,可提供 js 调OC,以及OC调JS
1. 设置 webViewBridge _bridge = [WKWebViewJavascriptBridge bridgeForWebView:self.webView]; [_bridge setWebViewDelegate:self]; 2. 注册handler方法,需要和 前段协商好 方法名字,是供 JS调用Native 使用的。 [_bridge registerHandler:@"scanClick" handler:^(id data, WVJBResponseCallback responseCallback) { // OC调用 NSString *scanResult = @"http://www.baidu.com"; // js 回调传参 responseCallback(scanResult); }]; 3. OC掉用JS [_bridge callHandler:@"testJSFunction" data:@"一个字符串" responseCallback:^(id responseData) { NSLog(@"调用完JS后的回调:%@",responseData); }];