JS 与 OC
做项目需要从网页点击跳转到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('参数');
JS 与 OC的更多相关文章
- JS 与OC 交互篇
完美记录交互 CSDN博客: (OC调用JS) http://blog.csdn.net/lwjok2007/article/details/47058101 (JS调用OC) http://blog ...
- JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz
iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码) 最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...
- UIWebView的应用和其中的JS与OC间传值
现在有很多的应用已经采用了WebView和html语言结合的开发模式.html5一直很火因为一份代码可以在多个平台上运用啊,效果各不相同都很美观,也越来越有一些公司直接招后台程序员和html5程序员, ...
- [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]
原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...
- UIWebView中Html中用JS调用OC方法及OC执行JS代码
HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...
- iOS中JS 与OC的交互(JavaScriptCore.framework)
iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...
- iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇
iOS7之后苹果为众猿推出了JavaScriptCore.framework这个框架,这个框架为大家在与JS交互上提供了很大帮助,可以在html界面上调用OC方法并传参,也可以在OC上调用JS方法并传 ...
- ios-UIWebView中js和oc代码的互调
webview是ios中显示远程数据的网页控件,webview能显示的内容很多,MP4.文本.pdf等等: 关于js和oc代码的互相调用 1:oc中调用js代码; >>oc中调用js代码很 ...
- 史上最全的 UIWebview 的 JS 与 OC 交互
来源:伯乐在线 - 键盘风筝 链接:http://ios.jobbole.com/89330/ 点击 → 申请加入伯乐在线专栏作者 其实一直想给大家整理一下JS与OC的交互,但是没有合适的机会,今天借 ...
- 【转】使用JavaScriptCore在JS和OC间通信
http://www.cocoachina.com/ios/20160623/16796.html iOS 开发中,我们时不时的需要加载一些 Web 页面,一些需求使用 Web 页面来实现可以更可控, ...
随机推荐
- 彻底领悟javascript中的this
this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test() { this.x = 1; } 随着函数使用场合 ...
- ASP.NET AJAX注册命名空间
AJAX库支持命名空间的概念. 类可以分组到不同的命名空间.AJAX库会自动创建在此层次中不存在的任何级别的命名空间. <%@ Page Language="C#" Auto ...
- URL中有中文字符,转码方法
服务端返回的urlString里面有时含有中文,使用 [NSURL URLWithString:urlString]生成URL对象时,iOS客户端不能正确进行网络请求,网上找到的URLEncode方法 ...
- <iOS>UIImage变为NSData并进行压缩
http://www.cnblogs.com/robinkey/archive/2013/01/21/2869930.html //sdk中提供了方法可以直接调用 UIImage *img = [UI ...
- TCP/IP 标志位 SYN ACK RST UTG PSH FIN
三次握手:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个 SYN=1,ACK=1标志的数据包给发送端,告诉它,可以 ...
- MySql5.6设置慢查询
---恢复内容开始--- 在my.cnf中 mysqld节点下 #开启慢查询 slow_query_log = ON #设置超时时间 slow_launch_time = 2 #记录日志 slow_q ...
- C语言-数组
C语言中使用数组来存储相同类型的大批量数据. 数组: 数组名:起名规则和变量名一样: 定义数组:数组每个元素存储的数据类型+数组名[常量(时表示数组分配存储数据类型的个数也就是长度)]={每个元素,以 ...
- SRM 592 DIV2 报告
昨天下午查看邮箱,看到了topcoder的SRM比赛通知和cf的比赛通知,当时什么也不想做,心里空荡荡的,忽然就想参加一下,试试看.吃完晚饭回来一看,就剩十几分钟了,匆忙把平台下了,就开始等待比赛开始 ...
- Js把IE COM数组列表转换成数组
今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...
- 直播流怎么存储在Ceph对象存储上? Linux内存文件系统tmpfs(/dev/shm) 的应用
一./dev/shm理论 默认的Linux发行版中的内核配置都会开启tmpfs,映射到了/dev/下的shm目录.可以通过df 命令查看结果./dev/shm/是linux下一个非常有用的目录,因为这 ...