2016.9.23
JSPatch是一个iOS动态更新框架,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何oc原声接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原声代码动态修复bug
基础原理
JSPatch能做到通过JS调用和改写OC方法最根本的原因是oc是动态语言,oc上所有方法的调用/类的生成都通过oc runtime在运行时进行,可以通过类名/方法名反射得到相应的类和方法:
Class class = NSClassFromString("UIViewController");
id controller = [class alloc] init];
SEL selector = NSSelectorFromString("viewDidLoad");
[controller performSelector:selector];
也可以替换某个类的方法为新的实现:
static void newViewDidLoad(id slf, SEL sel) {}
class_replaceMethod(class, selector, newViewDidLoad, @"");
还可以新注册一个类,为类添加方法:
Class cls = objc_allocateClassPair(superCls, "JPObject", 0);
objc_allocateClassPair(cls);
class_addMethod(cls, selector, implement, typedesc);
理论上可以在运行时通过类名/方法名调用任何oc方法,替换任何类的实现以及新增任意类。所以JSPatch的基本原理就是:JS传递字符串给oc,oc通过runtime接口调用和替换oc方法。这是最基础的原理。
接下来看具体怎样实现的
方法调用
require('UIView')
var view = UIView.alloc().init()
view.setBackgroundColor(require('UIColor').grayColor()
view.setAlpha(0.5)
引入JSPatch后,可以通过JS代码创建了一个UIView实例,并设置背景颜色和透明度,涵盖了require引入类,JS调用接口,消息传递,对象持有和转换,参数转换这五个方面