发个广告:iOS开发两年了,一步步走来,从小白到大白,有自己的新的体验 关注公众号一起进步,有技术、工具分享
1、为什么要分享JSPatch?
Cicada(iOS)1.6.0版本上线后发现有个非常严重的Bug,导致老版本升级之后一打开应用就Crash,如果紧急修复提交审核,最快也得三天左右,那么这三天的成本是巨大的,所以引入JSPatch进行热修复,动态更新App,替换项目原生代码,无需更新App即时修复Bug。
2、实现原理
JSpatch用iOS内置的JavaScriptCore.framework作为JS引擎,通过Objective-CRuntime,从JS传递要调用的类名函数名到Objective-C,在使用NAInvocation(一种消息调用的方法,并且它的参数没有限制)动态调用对应的OC方法。【备注:iOS中可以直接调用某个对象的消息方式有两种:a、performSelector:withObject;b、NSInvocation。】
3、基础原理
Objective-C是动态语言,OC上多有方法的调用/类的生成都通过Objective-CRuntime在运行时进行,我们可以通过类名/方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,还可以新注册一个类,为类添加方法。也就是说:理论上可以在运行时通过类名/方法名调用到任何OC方法,替换任何类的实现以及新增任意类。那么也可以这里理解JSPatch的原理:JS传递字符串给OC,OC通过Runtime接口调用和替换OC方法。
4、JSPatch导入
(1)使用Cocoapods进行管理,引入 pod ‘JSPatch’
(2)在AppDelegate导入 #import
(3)在didFinishLaunchingWithOptions中进行配置
5、本地调用
将写好的js文件拖到MacintoshHD/Library(资源库)/WebServer/Documents目录下,然后运行项目即可。
相关资源:
1、JSPatch-动态更新iOS APP http://blog.cnbang.net/works/2767/
2、JSPatch实现原理详解 http://blog.cnbang.net/tech/2808/
3、JSPatch实现原理详解(完善) http://www.iyeah.net/2015/07/06/3580.html
4、JSpatchGithub地址 https://github.com/bang590/JSPatch
5、JSPatch官网 http://jspatch.com
6、JSPatch使用文档 https://github.com/bang590/JSPatch/wiki
6、JSPatchConvertor http://bang590.github.io/JSPatchConvertor/
7、Objective-C对象模型和动态消息发送原理 http://blog.csdn.net/kesalin/article/details/6689226
8、Objective-C运行时编程指南 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html
补录
1.在js中 NSNumber不需要在处理,可直接当数值使用。
2. NSRang 初始化:
var range = {location: 0, length: senderName.length()};
3.无论变量还是方法,单下划线全部改为双下划线
4. CGRect 取宽高, 直接rect.width, 不用rect.size.width。其他结构体类似
5.js 中 YES 为 ture,NO 为false
6.替换实例方法第一个参数, 替换类方法是第二个参数
defineClass("FSBackBoardCell", {第一个参数},{第二个参数})
7.oc对象转js对象可操作toJS(),js对象转oc对象暂时没找到方法。
js内创建的字典为js对象,传入oc方法无效
8.jspatch 不支持变参方法,如stringWithFormat,可用js字符串方法或nsmutablestring代替。