目前已经有一些方案能够实现动态打补丁,例如WaxPatch,能够用Lua调用OC方法,相对于WaxPatch,JSPatch的优点是:前端
1.JS语言
JS比Lua在应用开发领域有更普遍的应用,目前前端开发和终端开发有融合的趋势,做为扩展的脚本语言,JS是不二之选。react
2.符合Apple规则
JSPatch更符合Apple的规则。iOS Developer Program License Agreement里3.3.2提到不可动态下发可执行代码,但经过苹果JavaScriptCore.framework或WebKit执行的代码除外,JS正是经过JavaScriptCore.framework执行的。ios
3.小巧
使用系统内置的JavaScriptCore.framework,无需内嵌脚本引擎,体积小巧。git
4.支持block
wax在几年前就中止了开发和维护,不支持Objective-C里block跟Lua程序的互传,虽然一些第三方已经实现block,但使用时参数上也有比较多的限制。github
相对于WaxPatch,JSPatch劣势在于不支持iOS6,由于须要引入JavaScriptCore.framework。另外目前内存的使用上会高于wax,持续改进中。web
JSPatch让脚本语言得到调用全部原生OC方法的能力,不像web前端把能力局限在浏览器,使用上会有一些安全风险:react-native
1.若在网络传输过程当中下发明文JS,可能会被中间人篡改JS脚本,执行任意方法,盗取APP里的相关信息。能够对传输过程进行加密,或用直接使用https解决。浏览器
2.若下载完后的JS保存在本地没有加密,在未越狱的机器上用户也能够手动替换或篡改脚本。这点危害没有第一点大,由于操做者是手机拥有者,不存在APP内相关信息被盗用的风险。若要避免用户修改代码影响APP运行,能够选择简单的加密存储。安全
JSPatch能够动态打补丁,自由修改APP里的代码,理论上还能够彻底用JSPatch实现一个业务模块,甚至整个APP,跟wax同样,但不推荐这么作,由于:网络
若想动态为APP添加模块,目前React Native给出了很好的方案,解决了上述三个问题:
因此动态添加业务模块目前仍是推荐尝试React Native,但React Native并不会提供原生OC接口的反射调用和方法替换,没法作到修改原生代码,JSPatch以小巧的引擎补足这个缺口,配合React Native用统一的JS语言让一个原生APP时刻处于可扩展可修改的状态。
目前JSPatch处于开发阶段,稳定性和功能还存在一些问题,欢迎你们提建议/bug/PR,一块儿来作这个项目。
Copy from JSPatch – 动态更新iOS APP