做项目需要从网页点击跳转到app的一个页面上,并且需要获取参数。
当时后台给写的参数是这样的。自己打开浏览器看的源码
JavaScript:window.location.href= 这句话在js里是弹出网页的意思
而我只需要把弹出的信息截取获取参数就可以了
这种直接弹出信息需要靠webView的delegate方法来解决
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *getURLString = [request.URL absoluteString]; NSLog(@"总的字符串:%@",getURLString); NSString *htmlHeadString = @"objc://"; //协议头可以自己定义可以自己定义 if([getURLString hasPrefix:htmlHeadString]) { NSLog(@"参数来了");
// 这里可以将网址拆分成所需要的参数 并且完成你所需要的操作 (跳转等等) return NO; } else return YES; }
这时就解决了
而本着好学的精神又了解了另外的方法
HTML代码如下
<html> <head> <title>第二个web</title> <meta charset="utf-8"> </head> <body> <p>JS通过JavaScriptCore/JavaScriptCore.hOC的方法</p> <p>姓名:孟玲旭</p> <p>博客主页:</p> <p >https://home.cnblogs.com/u/menglingxu/</p> <button type = "button" onclick = "locationFunction()" > JS调OC第二法无参数 </button> <button type = "button" onclick = "locationFunction2()" > JS调OC第二法传参数 </button> <button type = "button" onclick = "change.callChangeColor()" > 点击改变颜色</button> <script type = "text/javascript"> function locationFunction() { //调用OC的方法,没有参数 jstoocNoPrams(); } function locationFunction2() { //调用OC的第二个方法 jstoocHavePrams('参数1','参数2','参数3'); } </script> </body> </html>
这时已经给了oc两个方法,一个是 jstoocNoPrams 第二个是 jstoocHavePrams
我们要做的就是县引入框架
#import <JavaScriptCore/JavaScriptCore.h>
然后得到方法
- (void)handleJScallOC { //拿到WebView执行JS的执行环境,很重要的东西 JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //点击了无参数,jstoocNoPrams是JS的方法名称 context[@"jstoocNoPrams"] = ^(){ NSLog(@"点击了没有传参数按钮"); // 在这里完成操作 dispatch_async(dispatch_get_main_queue(), ^{ }); }; //点击传参数 jstoocHavePrams方法名称 context[@"jstoocHavePrams"] = ^(){ //获得参数 NSArray *prams = [JSContext currentArguments]; NSLog(@"%@", prams); dispatch_async(dispatch_get_main_queue(), ^{ }); }; }
这就是block的方式
细心的同学会发现
<button type = "button" onclick = "change.callChangeColor()" > 点击改变颜色</button>
这句话咋还没用上呢
这就是最后一种方法 协议的方式
首先写一个协议 注意名字 callChangeColor() 不要写错
@protocol MLGB <JSExport> - (void)callChangeColor; @end
然后遵循协议
最后
#pragma mark - 第二种方式JSEport协议方式 - (void)regiseterResponser { JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; [context setObject:self forKeyedSubscript:@"change"]; } - (void)callChangeColor { NSLog(@"MLGB");
// 实现所需要的操作。 }
以上就是JS调用OC
既然JS可以调用OC,那么OC 当然可以调用js
HTML代码
<html> <head> </head> <body> <meta http-equiv="Content-Type"content="text/html; charset=UTF-8"> <br> <p>OC调用JS的方法</p> <p>方法:stringByEvaluatingJavaScriptFromString</p> <br> <p>我的主页:</p> <p >https://home.cnblogs.com/u/menglingxu/</p> <script type="text/javaScript"> function callJS(param) { alert(param); } </script> </body> </html>
方法名为callJS(param)
那么OC代码为
- (void)callJS { NSString *param = @"放屁"; NSString *js = [NSString stringWithFormat:@"callJS('%@')",param]; NSString *string = [self.webView stringByEvaluatingJavaScriptFromString:js]; NSLog(@"%@",string); }
可以在webview加载完成之后看看效果
- (void)webViewDidFinishLoad:(UIWebView *)webView { [self callJS]; }
最主要的方法 :stringByEvaluatingJavaScriptFromString
或者 用第二种方法也是webview加载完成之后看看效果
- (void)webViewDidFinishLoad:(UIWebView *)webView { // [self callJS]; //获得WebView的运行环境的对象 JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //调用方法(注意:这里是JS里面的定义的方法) NSString *callJSstring = @"callJS('憋不住了,要放屁')"; [context evaluateScript:callJSstring]; }
千万别忘了方法名为callJS(param)这个方法OC在写的时候是这样的callJS('参数');