iOS7之后苹果为众猿推出了JavaScriptCore.framework这个框架,这个框架为大家在与JS交互上提供了很大帮助,可以在html界面上调用OC方法并传参,也可以在OC上调用JS方法并传参.这里简单的介绍一下这个框架的使用.

javaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,javaScriptCore是开源webkit的一部分,他提供了强大的整合能力.下面以JS调用OC方法为例,OC调用JS为例说明.

  • JSContext, JSContext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码
  • JSValue, JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等
  • JSExport, JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用

1.首先,导入JavaScriptCore.framework这个框架,target-->Build Phases-->Link Binary With Libraies添加这个框架.

2.在使用了文件里添加头文件

#import <JavaScriptCore/JavaScriptCore.h>

3.为了演示方便,这里我们写了一个本地的Test.html,使用webView加载Test.html.

这里,我们需要使用JavaScriptCore.framework这个框架里面的JSContext这个代表了获取到JS的运行环境.

 @property (nonatomic,strong) UIWebView * webView;
@property (nonatomic,weak) JSContext * context;

4.在.m文件中,加载html文件.viewDidLoad

     //创建一个webView来加载html
_webView = [[UIWebView alloc]init];
_webView.frame = CGRectMake(, , [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height/);
_webView.delegate = self;
[self.view addSubview:_webView]; //先加载一个本地的html
NSString * path = [[NSBundle mainBundle] pathForResource:@"Test.html" ofType:nil];
// NSLog(@"%@",path);
NSURL * url = [[NSURL alloc]initFileURLWithPath:path];
// NSLog(@"%@",url);
NSURLRequest * request = [NSURLRequest requestWithURL:url];
[_webView loadRequest:request];

5.创建两本原生button,演示OC调用JS方法.html中也写两个按钮和方法,用于演示JS调用OC.

     //创建两个原生button,演示调用js方法
UIButton * btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
btn1.frame = CGRectMake(, [UIScreen mainScreen].bounds.size.height/, , );
btn1.backgroundColor = [UIColor blackColor];
[btn1 setTitle:@"OC调用无参JS" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(function1) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn1];
UIButton * btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
btn2.frame = CGRectMake(, [UIScreen mainScreen].bounds.size.height/+, , );
btn2.backgroundColor = [UIColor blackColor];
[btn2 setTitle:@"OC调用JS(传参)" forState:UIControlStateNormal];
[btn2 addTarget:self action:@selector(function2) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn2];

html中

 <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>hello World</title>
</head> <script type="text/javascript"> function JSCallOc1(){
test1();
}
function JSCallOc2(){
test2('少停','iOS');
}
function aaa(){
alert("OC调用了无参数的js方法");
}
function bbb(name,num){
alert(name+num);
} </script> <body bgcolor="#555555">
<button type="button" onclick="JSCallOc1()">JS调用OC方法(无参)</button>
<button type="button" onclick="JSCallOc2()">JS调用OC方法(传参)</button>
</body>
</html>

准备工作完毕,下面演示JS与OC的交互.

UIWebViewDelegate方法中,有四个代理方法,开发中我们可以使用这几个方法在不同的时刻做不同的事情.

 #pragma UIWebViewDelegate方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSLog(@"开始响应请求时触发");
return YES;
}
- (void)webViewDidStartLoad:(UIWebView *)webView{
NSLog(@"开始加载网页");
}
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSLog(@"网页加载完毕"); }
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{
NSLog(@"网页加载出错"); }

JS调用OC方法并且传参

这里,我们在网页加载完毕之后让JS调用OC的方法并传参数.

 - (void)webViewDidFinishLoad:(UIWebView *)webView{
NSLog(@"网页加载完毕");
//获取js的运行环境
_context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//html调用无参数OC
_context[@"test1"] = ^(){
[self menthod1];
};
//html调用OC(传参数过来)
_context[@"test2"] = ^(){
NSArray * args = [JSContext currentArguments];//传过来的参数
// for (id obj in args) {
// NSLog(@"html传过来的参数%@",obj);
// }
NSString * name = args[];
NSString * str = args[];
[self menthod2:name and:str];
};
}

html里面

<body bgcolor="#555555">
<button type="button" onclick="JSCallOc1()">JS调用OC方法(无参)</button>
<button type="button" onclick="JSCallOc2()">JS调用OC方法(传参)</button>
</body>
    function JSCallOc1(){
test1();
}
function JSCallOc2(){
test2('少停','iOS');
}

如上所示,先行建立一个context来获取到JS的开发环境,使用一个block来执行OC方法.其中[@"test1"]中的test1需要和JS中的一致.

至于传参,]JSContext currentArguments]可以获取到js传过来的参数数组.那么就可以获取数组中值来使用了.接着我们就可以在这个block中调用OC的方法并且使用这些参数了.

 #pragma 供JS调用的方法
-(void)menthod1{
NSLog(@"JS调用了无参数OC方法");
}
-(void)menthod2:(NSString *)str1 and:(NSString *)str2{
NSLog(@"%@%@",str1,str2);
}

OC调用JS方法并且传参

至于OC调用JS方法也很简单,使用下面这个对象方法即可

- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
 #pragma OC调用JS方法
-(void)function1{
[_webView stringByEvaluatingJavaScriptFromString:@"aaa()"];
}
-(void)function2{
NSString * name = @"pheromone";
NSInteger num = ;//准备传去给JS的参数
[_webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"bbb('%@','%ld');",name,num]];
}

html里面

  function aaa(){
alert("OC调用了无参数的js方法");
}
function bbb(name,num){
alert(name+num);
}

也可以在OC中直接写JS代码来执行

     //1.直接调用
NSString *alertJS=@"alert('test js OC')"; //准备执行的js代码
[_context evaluateScript:alertJS];

演示截图:

以上就是有关JavaScriptCore.framework这个框架的简单使用.有关参考文档:

对于JavaScriptCore.framework的介绍:http://www.webryan.net/2013/10/about-ios7-javascriptcore-framework/

http://nshipster.cn/javascriptcore/

对于另外一个三方库WebViewJavascriptBridge的使用:http://blog.csdn.net/remote_roamer/article/details/7261490

本文源码下载地址:http://download.csdn.net/detail/shaoting19910730/9453841

https://github.com/pheromone/JavaScriptCore_demo/tree/master

iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇的更多相关文章

  1. iOS中JS 与OC的交互(JavaScriptCore.framework)

    iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...

  2. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  3. 李洪强漫谈iOS开发[C语言-042]-简单计算器

    李洪强漫谈iOS开发[C语言-042]-简单计算器

  4. iOS 开发 ZFUI framework控件,使布局更简单

    来自:http://www.jianshu.com/p/bcf86b170d9c 前言 为什么会写这个?因为在iOS开发中,界面的布局一直没有Android布局有那么多的方法和优势,我个人开发都是纯代 ...

  5. ios开发--网页中调用JS与JS注入

    先将网页弄到iOS项目中: 网页内容如下, 仅供测试: <html> <head> <meta xmlns="http://www.w3.org/1999/xh ...

  6. iOS开发-动态和静态FrameWork

    开发中我们会使用到第三方的SDK,有的时候也会将整个系统的公用的功能的抽象出来成为FrameWork,我们只需要暴露对外的接口,使用者只需要调用接口,对于内部实现的过程不需要维护,可以以库的形式进行封 ...

  7. iOS开发:Framework的创建

    转载自:http://jonzzs.cn/2017/06/01/iOS%20开发笔记/[iOS%20开发]将自己的框架打包成%20Framework%20的方法/ 环境:Xcode 8 创建 Fram ...

  8. iOS开发,音效的播放简单实现以及音效播放的简单封装

    一.音效的播放简单实现 二.音效播放的封装 -- 封装思路:将生成的SystemSoundID存放到字典中,每次播放的时候从字典中取出对应的SystemSoundID,没有的话再创建 头文件中定义类方 ...

  9. iOS开发 关于SEL的简单总结

    SEL就是对方法的一种包装.包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法.在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就 ...

随机推荐

  1. 项目文件包含 ToolsVersion="12.0" 设置,但此工具集未知或缺失。

    项目属性(Alt+F7),再点常规,常规中有个平台工作集,把V120改成V110或者v100,然后就能正常运行了.

  2. PHP读取文件夹目录,按时间排序,大小排序,名字排序

    工作中有时候会遇到文件存储数据,但是在前台显示的时候又因为没有数据库,无法使用上传或最后一次修改日期字段排序,所以有了如下代码: <?php $dir = "./";//目录 ...

  3. Sql语句统计多表个数并求和

    ) FROM ((SELECT BaseID FROM dbo.Life_cheliang WHERE BaseCreateDate BETWEEN '2015-6-5' AND '2015-6-11 ...

  4. C语言知识整理(3):内存管理(详细版)

    在计算机系统,特别是嵌入式系统中,内存资源是非常有限的.尤其对于移动端开发者来说,硬件资源的限制使得其在程序设计中首要考虑的问题就是如何有效地管理内存资源.本文是作者在学习C语言内存管理的过程中做的一 ...

  5. jquery中ajax常用方法

    index.html: <h3>$.get(url, [data], [callback], [type])<br/> $.post(url, [data], [callbac ...

  6. BZOJ3999 [TJOI2015]旅游

    题面:给定一个有$n$个节点的树,每个点又点权$v_i$,每次选取一条树链$[a, b]$,求出$max(v_i - v_j)$,其中$i, j \in [a, b]$且$i$出现在$j$前面,最后树 ...

  7. 第二章 XHTML基础

    1.一个网页,也就是一个XHTML文档,是由元素组成.元素定义了文本和图形在XHTML文档中的结构.XHTML文档的扩展名通常是.html或者htm. 2.XHTML元素使用XHTML标记定义,每个标 ...

  8. svn cleanup failed问题解决

    1.SVN出错 今早过来Update,报如下错误: 再次更新,svn会要求你执行clean up,但执行clean up仍会报错,说有未完的work item,还要求你执行clean up.汗,陷入死 ...

  9. web安全测试-AppScan

    安全测试应该是测试中非常重要的一部分,但他常常最容易被忽视掉. 尽管国内经常出现各种安全事件,但没有真正的引起人们的注意.不管是开发还是测试都不太关注产品的安全.当然,这也不能怪我们苦B的“民工兄弟” ...

  10. matlab代码 图像处理源码

    非常不错的找图像处理源码的地方,源码搜搜. http://www.codesoso.com/Category.aspx?CategoryId=56