Alex

js与iOS的交互(二)

年关将至,今年在公司由于公司管理上的问题貌似没有什么产品上的收获,有点小悲哀。不过好在对计算机的兴趣还是比较足的,平时对各方面的研究也不少,在理论知识和理解上好歹还有一点收获….  在这里顺便记录一下对js与iOS深度交互的学习与理解。

首先介绍一下javaScriptCore.framework这个框架,这个框架是自iOS7提出的一个基于webkit以C/C++实现的javaScriptCore的一个包装,用来实现native与web的交互,可见苹果是支持开发者在项目中进行混编的,不过这也是大势所趋。

框架导入(首先要将javaScriptCore.framework添加至项目):

再来看下其中包含的头文件:

主要有五个部分,其中分别负责的功能为

JSContext: 为JavaScript提供运行环境,通过- (JSValue *)evaluateScript:(NSString *)script;方法就可以执行一段JavaScript脚本,并且如果其中有方法、变量等信息都会被存储在其中以便在需要的时候使用。而JSContext的创建都是基于JSVirtualMachine:- (id)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine;,如果是使用- (id)init;进行初始化,那么在其内部会自动创建一个新的JSVirtualMachine对象然后调用前边的初始化方法。

JSValue: JavaScript与Objective-C之间值属性的桥梁,其转换规则为:1AEAB543-CF76-482D-BF01-2A6C8059641C

JSManagedValue: 用来协调JavaScript与Objective-C内存管理的工具

JSVirtualMachine: 为JavaScript的运行提供底层资源

JSExport: 将Objective-C互通给JavaScript的协议

下面我们实践一下功能


 

1.native调用web端带返回值的js

首先我们随便写个页面部署在本地Apache服务器上

然后我们在native端加载一个webview访问刚才部署的页面,调用js方法接收反馈值并输出

317A01EC-720D-4A8E-A32E-DA9B21C4051C

这说明方法是可行的,在这里提一下,如果不明白为什么获取当前webView的jscontext是这样写的

可以先看一下这篇介绍UIWebView体系结构的博文 ,作者分成了好几块写,可以仔细看一下。

在这里顺便分享一处歪果仁dump出来的iOS headers github地址,在这里可以查看iOS各大框架的api,再合理的利用KVC编程有时候还是比较方便的。

2.web端js调用native方法

在这里又分为两种情况,一种是直接调用,实践一下:

同样是本地部署页面,我们通过html的按钮触发js

这里增加了sayhi的js方法,并带有a,b,c三个参数,点击按钮调用方法并且随便传了三个参数,再看native端的代码

运行模拟器,点击载入web页面的按钮触发js,可以看到正常输出

FA5B7D57-4513-4400-A432-4090925E4101

另一种情况是通过JSExport协议来实现,所有继承了该协议的协议中定义的方法都可以在JSContext中被使用

新建一个Student类,编写下列代码

在web中调用:

成功调用~

2948A436-E165-45B0-A146-371F43CCA390

javaScriptCore框架的大概使用差不多就是这样了,要真正熟悉的话还是得在项目中多多实践积累使用经验。

顺便分享一个UIWebView/WebViews和JS交互的封装库 WebViewJavascriptBridge

 

如果有什么问题,请联系告知,thx

4(K3EIP)PLVZ87){T6MIT_3

 

码字很辛苦,转载请注明来自Alex博客笔记《js与iOS的交互(二)》

评论