前言动态是移动开发技术的重要组成部分。目前常见的动态解决方案,如ReactNative、Weex、Hybrid部分解决方案以及之前流行的热修复框架JSPatch,背后都使用了JavaScriptCore框架,它在OC和JS语言之间架起了一座桥梁。JavaScriptCore简介JavaScriptCore是Safari浏览器的JavaScript引擎,用于解释和执行JavaScript代码。JavaScriptCore框架是Apple在iOS7中引入的框架。这个框架使得Objective-C和JavaScript代码之间的直接交互变得更加简单和方便。其实就是webkit中基于C/C++实现的JavaScriptCore的OC版本封装。JavaScriptCore和JavaScriptCoreframework是两个不同的概念,大家可以自行理解。OC调用JS代码//直接执行js代码JSContext*cxt=[JSContextnew];JSValue*val=[cxtevaluateScript:@"(functionocCallJS(){return'ocCallJS'})()"];NSLog(@"%@",[valtoString]);//ocCallJS//注册js方法,使用JSValue调用JSContext*cxt=[JSContextnew];JSValue*jsFunction=[cxtevaluateScript:@"(function(arg){returnarg})"];JSValue*val=[jsFunctioncallWithArguments:@[@"helloobjc"]];NSLog(@"%@",[valtoString]);//helloobjc这里有几个对象来理解JSContextJSContext对象代表JavaScript的执行环境,所有的JavaScript执行都发生在上下文中,所有的JavaScript值都与上下文相关联。JSValueJSValue实例是JavaScript值的包装器(引用),您可以使用JSValue类在JavaScript和Objective-C或Swift表示之间转换原始值(例如数字和字符串),以便在本机和JavaScript代码数据之间传递。您还可以使用此类创建包含自定义类的JavaScript对象或JavaScript函数的本机对象,其实现由本机方法或块提供。JS调用OC代码Block方法//注册一个oc方法给js调用JSContext*cxt=[JSContextnew];cxt[@"nativeMethod"]=^(NSString*msg){NSLog(@"%@",msg);//jsCallOC};//js调用oc的方法[cxtevaluateScript:@"nativeMethod('jsCallOC')"];JSExport方法//将定义类暴露给js@protocolJSBridgeObjProtocol
