当前位置: 首页 > Web前端 > HTML5

JavaScriptCore使用

时间:2023-04-04 23:17:19 HTML5

前言动态是移动开发技术的重要组成部分。目前常见的动态解决方案,如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-(NSString*)fetchArticleContent;@end@interfaceJSBridgeObj:NSObject@property(nonatomic,copy)NSString*articleTitle;-(NSString*)fetchArticleContent;@end@implementationJSBridgeObj-(NSString*)fetchArticleContent{return@"jscalloc";}@end//js调用oc方法JSContext*cxt=[JSContextnew];cxt[@"jsBridge"]=[JSBridgeObjnew];JSValue*val=[cxtevaluateScript:@"jsBridge.fetchArticleContent()"];NSLog(@"%@",[valtoString]);//js调用ocJXExport实现的协议将OC类及其实例方法、类方法和属性导出到JavaScript代码中,这样基于JSContext我们就可以在Hybrid开发中完成两种语言APP之间的通信,在混合开发中,获取JSContext对象在UIWebView中,这个操作借用了苹果的私有方法。//获取当前WebView的JS上下文JSContext*context=[webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];但是这种方法获取JS上下文有几个问题:1)获取JS上下文的时机是不确定的,比如创建UIWebView对象时,UIWebView的不同代理回调方法获取的JS上下文是不同的,以及每次加载新的URL时,旧的JS上下文将被丢弃,并创建一个新的JS上下文。因此,获取JS上下文的时机非常重要,也就是刚创建新的JS上下文的时刻。只是苹果并没有在iOSSDK中暴露,macOSSDK有代理方法获取创建的JS上下文。webView:didCreateJavaScriptContext:forFrame:GitHub上有这样一个项目TS_JavaScriptContext,可以获取JS上下文创建的事件,但是获取方式也是苹果的私有API。原来项目中用到了这个库,上架苹果应用商店是没有问题的。现在审计情况不太了解。2)WKWebView目前我还没有找到获取JS上下文的方法。在UIWebView中获取JS上下文的方法在WKWebView中不起作用。WKWebView不支持JavaScriptCore的方式,提供messagehandler的方式是JS和OC通信。关于WKWebView的相关知识,后面再说。欢迎关注公众号:dreamlee,我们一起见证你的成长!