JSPatch

weixin_33936401發表於2017-11-28

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呼叫介面,訊息傳遞,物件持有和轉換,引數轉換這五個方面