本篇主要讲的是UIWebView和JS的交互,在下一节会有wkWebView和JS交互的详解https://www.cnblogs.com/llhlj/p/9144110.htmlhtml
方式一:url拦截,这里略过java
注意:在iOS中拦截到的url scheme将所有转化为小写;ios
html中须要设置编码,不然中文参数可能会出现编码问题;web
JS用打开一个iFrame的方式替代直接用document.location的方式,document.location 有一个很严重的问题,就是若是咱们连续 2 次改 document.location 的话,在 delegate 方法中,只能截获后面那次请求,前一次请求因为很快被替换掉,因此被忽略掉。编码
方式二:经过JavaScriptCore(iOS 7以后),用来作JS交互,所以JS与原生OC交互也变得简单了许多。atom
//获取js上下文,及本地添加js调用方法,通常状况下都放在-(void)webViewDidFinishLoad:(UIWebView *)webView方法里。lua
-(void)webViewDidFinishLoad:(UIWebView *)webView{ //获取js上下文 self.jscontext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //添加js代用方法 self.jscontext[@"octestFunc"]= ^(){ //oc逻辑 NSArray *array = [JSContext currentArguments]; for (NSString *value in array) { NSLog(@"收到js值:%@",value); } return @"oc";//也能够没有返回值 }; //异常处理 当oc本地调用的js方法不存时,会打印异常信息,注意只有经过上下文调用的才会异常处理如oc调用js方式二、3 self.jscontext.exceptionHandler = ^(JSContext* context,JSValue *exceptionValue){ NSLog(@"异常信息:%@", exceptionValue); }; }
方式三:同方式二类似,经过JSExport协议url
自定义协议spa
@protocol JSObjcDelegate<JSExport>//自定义协议 //自定义交互方法 -(id)getMessage:(id)msg; @end @interface WebViewController ()<UIWebViewDelegate,JSObjcDelegate> @property(nonatomic,strong)UIWebView *webView; @property(nonatomic,strong)JSContext *jscontext; @end
设置代理代理
-(void)webViewDidFinishLoad:(UIWebView *)webView{ //获取js上下文 self.jscontext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //设置代理 self.jscontext[@"ios"]= self; //异常处理 当oc本地调用的js方法不存时,会打印异常信息,注意只有经过上下文调用的才会异常处理如oc调用js方式二、3 self.jscontext.exceptionHandler = ^(JSContext* context,JSValue *exceptionValue){ NSLog(@"异常信息:%@", exceptionValue); }; }
代理方法的实现
//代理方法的实现 -(id)getMessage:(id)message{ NSLog(@"getMessage-------%@",message); return @"oc";//返回值能够没有 }
-(void)callJSFunc{ //方式1 // NSString *jsText = [NSString stringWithFormat:@"ocCallJSFunc('%@')",@"哈哈"]; // id value = [self.webView stringByEvaluatingJavaScriptFromString:jsText];//也可能没有返回值 // NSLog(@"value-----%@",value); //方式2 // JSValue *callback = self.jscontext[@"ocCallJSFunc"]; // id value2 = [callback callWithArguments:@[@"222"]]; // NSLog(@"value2-----%@",value2); //方式3 NSString *jsText = @"ocCallJSFunc('222')"; id value3 = [self.jscontext evaluateScript:jsText]; NSLog(@"value3-----%@",value3); }
注意:stringByEvaluatingJavaScriptFromString是一个同步的方法,使用它执行JS方法时,若是JS 方法比较耗的时候,会形成界面卡顿。
官方推荐使用WKWebView(ios8)的evaluateJavaScript:completionHandler:代替这个方法。