OC和JS的交互---JavaScriptCore
JavaScriptCore的简单介绍
JavaScriptCore是iOS7提供的原生框架,可以让Objective-C和JavaScript提供简单直接的交互。
JavaScriptCore的使用
导入JavaScriptCore.framework
在需要使用的类中引入头文件
#import <JavaScriptCore/JavaScriptCore.h>
点开头文件,我们可以看到
#import "JSContext.h"
#import "JSValue.h"
#import "JSManagedValue.h"
#import "JSVirtualMachine.h"
#import "JSExport.h"
这些都是框架的时候会使用到的东西。
通过OC执行JS方法或调取JS属性
//通过OC执行js方法或调取js属性。
JSContext *context = [[JSContext alloc]init];
[context evaluateScript:@"var arr = [1, 2, 'This is js string'];var sum = function(a, b) { return a+b;}"];
//访问js中定义的数组arr
JSValue *jsArr = context[@"arr"];
NSArray *ocArr = jsArr.toArray;
NSLog(@"%@",ocArr); //执行js中定义的方法,传入参数并得到结果
JSValue *jsSum = context[@"sum"];
JSValue *jsSumResult = [jsSum callWithArguments:@[@,@]];
NSInteger sumResult = jsSumResult.toInt32;
NSLog(@"%d",(int)sumResult);
JSContext对象:
它是JS的运行环境,它有一个方法-evaluateScript,这个方法可以运行一段js代码。而且,js中的所有变量方法都会保存在JSContext中,通过操作JSContext对象,可以实现调用js的方法和存取js的对象。
JSValue对象:
它对应着JSContext中的所有方法和属性,它也是OC和JS相互访问和修改的中间体,所有OC 和 javaScript的跨语言操作都要通过JSValue一些方法进行。
NSNumber *jsarr0 = jsArr[].toNumber;
jsArr[] = @;
通过JSValue对象的 callWithArguments:方法来直接调取 js 的 function。js function的多参数,在OC中,由NSArray组装而成。
//执行js中定义的方法,传入参数并得到结果
JSValue *jsSum = context[@"sum"];
JSValue *jsSumResult = [jsSum callWithArguments:@[@,@]];
// JSValue *jsSumResult = [jsSum callWithArguments:[NSArray arrayWithObjects:@2, @3, nil]];
//jsSumResult = 5;
通过JS执行OC方法,或者调用OC属性
我们可以使用Block来调用方法
-(NSInteger) sumWithA:(NSInteger)a WithB:(NSInteger)b WithC:(NSInteger)c{
return a+b+c;
}
-(void)test{
JSContext *context = [[JSContext alloc]init];
context[@"sumNums"] = ^(NSInteger a,NSInteger b,NSInteger c){
return [self sumWithA:a WithB:b WithC:c];
};
JSValue *sum = [context evaluateScript:@"sumNums(7, 56, 22)"];
NSLog(@"%@",sum);
}
上述代码中,sumWithA:WithB:WithC 是我们定义的OC的方法,在JS调用OC方法时,首先声明一个JSContext对象,然后对sumNums赋值一个Block,在Block中,我们调用OC定义的方法sumWithA:WithB:WithC。我们使用evaluateScript来执行一段JS代码,尝试调用OC方法,最后输出结果。
1. 不论在任何情况下,不要在Block中直接使用外面的JSValue对象, 而应该把JSValue当做参数来传进Block中。
2. 不论在任何情况下,不要在Block中直接使用外面的JSContext对象, 而应该使用 [JSContext currentContext]获取。
OC和JS的交互---JavaScriptCore的更多相关文章
- iOS OC与JS的交互(JavaScriptCore实现)
本文包括JS调用OC方法并传值,OC调用JS方法并传值 本来想把html放进服务器里面,然后访问,但是觉得如果html在本地加载更有助于理解,特把html放进项目里 HTML代码 <!DOCTY ...
- iOS OC和JS的交互 javaScriptCore方法封装
一.javaScriptCore javaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,javaScriptCore是开源webkit的一部分,他提供了强大的 ...
- OC与JS的交互(iOS与H5混编)
大神总结WKWebView的坑:https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA 在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景. iO ...
- [转]OC与JS的交互详解
事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...
- OC与JS的交互
现在APP的开发已经不局限于原生开发,很多都是原生+html5这种混合开发 我们可以通过webView这个控件,实现混合开发. 1.首先你需要创建一个html页面 <html> <h ...
- OC与JS的交互详解
事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...
- 实现OC与JS的交互
oc-->js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数.一句js代码或他们 ...
- OC和JS的交互
1.引入类拓展UIWebView+TS_JavaScriptContext, 这个类拓展是能在JSCotext出现的时候就可以拿到. 因为一般情况下JSCotext在webViewDidFinishL ...
- iOS中JS 与OC的交互(JavaScriptCore.framework)
iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...
随机推荐
- asp.net时间范围查询
1.首先要查询类表中的一个时间段,要明确我的数据库中只有一个时间字段,我们先将他拆分一下. if ($("#news_OpenTime").val() != "" ...
- Masonry 添加约束要注意顺序
对一个视图添加约束,其依赖的约束必须先已经存在,不能依赖该代码后的约束,否则造成不可预料的结果,如下代码能达到预期效果 - (void)makeConstraints { __weak typeof( ...
- asp 301代码
<% if request.ServerVariables("HTTP_HOST")="ksfmjy.com" then Response.Status= ...
- CreateProcess函数诡异的表现
场景:程序A使用CreateProcess函数去启动另一个程序(.exe)文件,在绝大部分情况下是可以成功启动的,但是在某些电脑上无效. 因为这“某些电脑”实在不好找,终于有一天借到一台这样的电脑. ...
- HDU 1517 A Multiplication Game 博弈
题目大意:从1开始Stan与Ollie经行博弈,stan先手,每次将当前数乘上(2~9)间的任意数,最后一次操作后大于等于n的人获胜. 题目思路: 1-9 stan 胜 10-18 ollie胜 19 ...
- centos7 安装nodejs,git
yum -y install gcc make gcc-c++ openssl-devel wget 下载源码及解压: wget http://nodejs.org/dist/v0.10.26/nod ...
- jquery学习笔记3——jq HTML
jQuery最常用的部分就是操作DOM,jQuery提供了一系列操作DOM的相关方法,使其很容易: 一.获取 1.获取内容 text()方法 设置或返回所选元素的文本内容: html()方法 ...
- 二十八、oracle 视图
一.介绍视图是一张虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视 ...
- 【.NET】发送Email
首先,在web.config的appSettings配置一下. <appSettings> <add key="FromMail" value="xxx ...
- 通过HttpModule管道,帮助api对接开发
我们公司的技术以.net为主,最近公司的项目需要和其它以java为主的公司搞对接. .net提供webapi由java请求调用. 目前出现java说调用了,但是.net一直接收不到数据.两方开发人 ...