一、说明
本篇文章呢主要聊一下JavaScriptCore的使用,为自己做个记录。JavaScriptCore 是苹果 Safari 浏览器的 JavaScript 引擎,JavaScriptCor在 OS X 平台上很早就存在的,而在 iOS 平台,直到IOS7才对外开放,并提供了 Objective-C 的接口。
二、主要类
(一)JSContext:A JSContext object represents a JavaScript execution environment.一个 Context 就是一个 JavaScript 代码执行的环境,也叫作用域。所有的JSValue都是捆绑在一个JSContext上的。
(二)JSExport:The JSExport protocol provides a declarative way to export Objective-C instance classes and their instance methods, class methods, and properties to JavaScript code.可以用这个协议来将原生对象导出给JavaScript,这样原生对象的属性或方法就成为了JavaScript的属性或方法。
(三)JSValue:A JSValue is a reference to a value within the JavaScript object space of a JSVirtualMachine.可以说是JavaScript和Object-C之间互换的桥梁,它提供了多种方法可以方便地把JavaScript数据类型转换成Objective-C,或者是转换过去。对应方式如下表:
(四)JSVirtualMachine:A JSVirtualMachine instance represents a self-contained environment for JavaScript execution.JSVirtualMachine为JavaScript的运行提供了底层资源,管理JS运行时和管理JS暴露的OC对象的内存。
(五)A JSManagedValue object wraps a JSValue object, adding “conditional retain” behavior to provide automatic memory management of values.解决JS和原生代码之间循环引用的问题
三、使用
要使用JavaScriptCore首先我们需要引入它的头文件#import<JavaScriptCore/JavaScriptCore.h>
本篇文章结合此Demo代码主要讲两个方面:
(一)JSCallOC
1、导入头文件#import<JavaScriptCore/JavaScriptCore.h>
2、给控制器添加webView属性和JSContext对象属性;这里是用webView加载的本地网页(of course,别忘了遵守UIWebViewDelegate协议,设置代理)
3、实际界面操作如下图:
上图一整个界面是一个网页,点击网页主要实现以下功能:
1、计算阶乘:在输入框中输入一个数字,然后在OC中计算出结果,最后显示在HTML的页面上;
2、测试log:在后台打印测试数据;
3、OC原生Alert :点击后,弹出OC的提示框;
4、addSubView:添加一个View;
5、push to second ViewController:跳转控制器
那么问题来了,怎么获取点击事件呢,这就需要iOS工程师和后端开发人员进行沟通协定为html中的元素添加一个点击事件方法:
然后以block形式关联JavaScript function,
但是,若以以下形式为元素添加点击方法:那么就要用JSExport协议关联native的方法,要在webView的delegate里面添加如下代码:然后,在.h文件中再声明一个继承JSExport的协议,协议中声明供JS使用的OC的方法:
在.m文件中实现这些方法就OK了。
(二)OCCallJS:
1、同样的别忘了导入头文件
2、点击“js处理”按钮后,将textfild的数据传给js,js计算完成后把结果在返回回来!首先要获取JS里面的计算函数,在OC中,所有表示JS中的对象,都用JSValue来创建,通过objectForKeyedSubscript方法或者直接使用下标的方法获取JS对象,然后使用callWithArguments方法来执行函数:
暂且先记录到此!