一、解决问题

目前我们的app大多都是与前端h5页面混合开发,有些数据类似但却要app端和h5端各维护一套代码,不便于管理,代码逻辑也可能存在差异

二、新技术概述

JavaScriptCore是webkit的一个重要组成部分,主要是对JS进行解析和提供执行环境iOS7后苹果在iPhone平台推出,极大的方便了我们对js的操作。我们可以脱离webview直接运行我们的js。iOS7以前我们对JS的操作只有webview里面一个函数 stringByEvaluatingJavaScriptFromString

JavaScriptCore是WebKit的内置JavaScript引擎。目前,它实现的ECMAScriptECMA-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的时候苹果也就已经支持,文档更新也较频繁,目前没发现存在哪些风险

五、详细说明

  1. JavaScriptCore是属于系统库,首先引入库
#import <JavaScriptCore/JavaScriptCore.h>
// 该库里面包含JSContext、JSVirtualMachine、JSValue等,我们需要用到的具体类
  1. 读取本地.js的文件:
    导入js文件放在本地,每次js文件更新的话,需要重新导入
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"js"];
    NSString *script = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
  1. 创建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文件:

javascript 苹果菜单 javascript怎么打开苹果_lua

代码示例执行结果:

javascript 苹果菜单 javascript怎么打开苹果_javascript 苹果菜单_02