一、解决问题
目前我们的app大多都是与前端h5页面混合开发,有些数据类似但却要app端和h5端各维护一套代码,不便于管理,代码逻辑也可能存在差异
二、新技术概述
JavaScriptCore是webkit的一个重要组成部分,主要是对JS进行解析和提供执行环境iOS7后苹果在iPhone平台推出,极大的方便了我们对js的操作。我们可以脱离webview直接运行我们的js。iOS7以前我们对JS的操作只有webview里面一个函数 stringByEvaluatingJavaScriptFromString
JavaScriptCore是WebKit的内置JavaScript引擎。目前,它实现的ECMAScript在ECMA-262规范
文档地址:JavaScriptCore官网 发布时间:最早发布时间2006年8月2日,最新更新时间2021年1月10日
三、效益
能够解决我们app与h5端业务代码冗余的问题,不用维护多套代码
之前我们与h5的交互,都是依靠webView的,必须要有web页面加载的前提下,构建js方法,进行交互,如今引入JavaScriptCore的话,可以直接访问js的方法,具体调用如下:
JSVirtualMachine *vm = [[JSVirtualMachine alloc] init];
JSContext *ctx = [[JSContext alloc] initWithVirtualMachine:vm];
// 获取本地的js文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"js"];
NSString *script = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[ctx evaluateScript:script];
// 调用js文件的getTargetName的函数,返回函数
JSValue *funcValue = ctx[@"getTargetName"];
NSLog(@"func:%@",funcValue);
// 传入函数的入参,返回结果
JSValue *resultValue = [funcValue callWithArguments:@[@4]];
NSLog(@"resultValue:%@",[resultValue toDictionary]);
四、风险
查看该技术的官网文档,从2006年到现在,已有十几年的时间,已经很成熟,在ios7的时候苹果也就已经支持,文档更新也较频繁,目前没发现存在哪些风险
五、详细说明
- JavaScriptCore是属于系统库,首先引入库
#import <JavaScriptCore/JavaScriptCore.h>
// 该库里面包含JSContext、JSVirtualMachine、JSValue等,我们需要用到的具体类
- 读取本地.js的文件:
导入js文件放在本地,每次js文件更新的话,需要重新导入
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"js"];
NSString *script = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
- 创建js上下文,提供对js执行的环境和对js数据的解析
JSVirtualMachine *vm = [[JSVirtualMachine alloc] init];
JSContext *ctx = [[JSContext alloc] initWithVirtualMachine:vm];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"js"];
NSString *script = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[ctx evaluateScript:script];
JSValue *funcValue = ctx[@"getTargetName"];
NSLog(@"func:%@",funcValue);
// 使用callWithArguments对函数进行传参,可传多参数,数组形式
JSValue *resultValue = [funcValue callWithArguments:@[@4]];
// JSValue为返回的对象,可转多种数据格式
NSLog(@"resultValue:%@",[resultValue toDictionary]);
完整代码:
js文件:
代码示例执行结果: