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的更多相关文章

  1. iOS OC与JS的交互(JavaScriptCore实现)

    本文包括JS调用OC方法并传值,OC调用JS方法并传值 本来想把html放进服务器里面,然后访问,但是觉得如果html在本地加载更有助于理解,特把html放进项目里 HTML代码 <!DOCTY ...

  2. iOS OC和JS的交互 javaScriptCore方法封装

    一.javaScriptCore javaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,javaScriptCore是开源webkit的一部分,他提供了强大的 ...

  3. OC与JS的交互(iOS与H5混编)

    大神总结WKWebView的坑:https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA 在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景. iO ...

  4. [转]OC与JS的交互详解

    事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...

  5. OC与JS的交互

    现在APP的开发已经不局限于原生开发,很多都是原生+html5这种混合开发 我们可以通过webView这个控件,实现混合开发. 1.首先你需要创建一个html页面 <html> <h ...

  6. OC与JS的交互详解

    事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...

  7. 实现OC与JS的交互

        oc-->js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数.一句js代码或他们 ...

  8. OC和JS的交互

    1.引入类拓展UIWebView+TS_JavaScriptContext, 这个类拓展是能在JSCotext出现的时候就可以拿到. 因为一般情况下JSCotext在webViewDidFinishL ...

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

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

随机推荐

  1. 利用rabbit_mq队列消息实现对一组主机进行命令下发

    目的: 利用rabbit_mq队列消息实现对一组主机进行命令下发 server: #!/usr/bin/env python3.5 # -*- coding:utf8 -*- import os,sy ...

  2. python socket服务器进行远程升级

    # coding:utf-8from socket import *import binascii, linecache, time ServerUrl = "127.0.0.1:900&q ...

  3. H264所采用的指数格伦布熵编码算法原理及应用

    1 指数格伦布熵编码算法原理 1.1 无符号整数k阶指数格伦布算法编码过程: 1) 将数字以二进制形式写出,去掉最低的k个比特位,之后加1 2) 计算留下的比特数,将此数减一,即是需要增加的前导零个数 ...

  4. HDU 4998 Rotate (计算几何)

    HDU 4998 Rotate (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4998 Description Noting is more ...

  5. redis12--常用API

    上一篇总结我们使用我们本地的Eclipse中创建的jedis工程,链接到了我们处于VMware虚拟机上的Linux系统上的Redis服务,我们接下来讲一下jedis的一些常用的API.(1)jedis ...

  6. 成都IT公司面经及公司评价

    从2015年年底到2016年初找了几个月工作,面了大大小小若干公司,有很不错的公司,也有很多坑公司,与君共勉. 1.科大讯飞 地址:成都分公司位于天府软件园E区,占一层楼.面积挺大.公司装修风格很舒服 ...

  7. SLF4J 使用简记

    SLF4J 使用简记 使用 SLF4J有一段时间了,在此作上些许记录,以作提示. 本文使用的实际实现的日志框架是 Log4j,所以使用 log4j.properties 文件 SLF4J 需要引入的j ...

  8. HDU 5860 Death Sequence

    用线段树可以算出序列.然后o(1)询问. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<c ...

  9. IOS开发小技巧,知识点

    1.IOS模拟器第一次打开需要进入“设置”中关掉"Auto-Capitalization"选项. 2.NSInteger转化 NSString类型: [NSString strin ...

  10. 关于闭包与for循环的理解

    function createFunction1(){ for(var i=0;i<5;i++){ function s(){ console.log(i); } s(); } } create ...