iOS如果線下出現(xiàn)bug, 這個(gè)好解決, 但如果線上出bug, 由于APP Store提交審核有時(shí)間限制, 修改完再提交怎么也得要3-4天, 于是就有了熱修復(fù). 如今熱修復(fù)主要有幾個(gè)相對(duì)成熟的框架, 一個(gè)Bang大神的JSPatch, 一個(gè)已停止維護(hù)幾年的WaxPatch, 還有一個(gè)阿里出品的Ali-Wax. 今天就來(lái)學(xué)習(xí)下JSPatch, 學(xué)習(xí)成本較低, 只需簡(jiǎn)單的JS語(yǔ)法即可, 而且對(duì)oc比較友好, 缺點(diǎn)就是沒(méi)有對(duì)js友好的編輯器, 當(dāng)然官方出了個(gè)xcode的插件, 叫jspatchx, 有興趣的可以試用一下.下面就來(lái)學(xué)習(xí)下
JSPatch接入比較簡(jiǎn)單, 拖一個(gè)framework,添加libz還有JavaScriptCore框架就完成了集成, 相當(dāng)輕量級(jí), 具體教程可以看官方接入文檔
為了熟悉JSPatch的基本用法, 個(gè)人思路就是通過(guò)JS來(lái)寫OC的基本控件學(xué)習(xí)基礎(chǔ). 本人用的sublime text下載地址來(lái)編輯JS, 對(duì)JS相對(duì)友好一些, xcode就有點(diǎn)雞肋的感覺(jué). 在sublime text編輯完之后, 然后cmd + s 保存再運(yùn)行項(xiàng)目. 開始的時(shí)候建議用sublime text新建一個(gè)main.js, 然后拖到你的項(xiàng)目里邊, 如圖一, 調(diào)用[JSPatch testScriptInBundle] , 這樣就可以直接在項(xiàng)目中測(cè)試JS代碼, JS編輯測(cè)試沒(méi)問(wèn)題之后, 就把下面注釋的打開, 如圖一
四. 定義類, 然后引用原來(lái)方法, 然后添加新的方法進(jìn)去
defineClass("ViewController",{
viewDidLoad:function(){
self.ORIGviewDidLoad();//引用原來(lái)的方法
})
五. 寫一個(gè)簡(jiǎn)單的Label
defineClass("ViewController",{
viewDidLoad:function(){
self.ORIGviewDidLoad();//引用原來(lái)的方法
var label = require('UILabel').alloc().initWithFrame({x:0,y:0,width:100,height:50});
label.setText("Jspatch");
label.setTextAlignment(2);//0:left 1:center 2:right
label.setBackgroundColor(require('UIColor').redColor());
self.view().addSubview(label);
})
六. 再寫一個(gè)簡(jiǎn)單的Button
var button = require('UIButton').buttonWithType(0);
button.setFrame({x:50,y:50,width:100,height:50});
button.setBackgroundColor(require('UIColor').redColor());
button.setTitle_forState('clickMe',0);
button.setTitleColor_forState(require('UIColor').blueColor(),0);
self.view().addSubview(button);
button.addTarget_action_forControlEvents(self,'handleBtn',1 << 6);
七.寫一個(gè)view, 使用Masonry進(jìn)行約束. 需要注意的是, Masonry里面的方法都會(huì)帶前綴mas_, 需要轉(zhuǎn)換成mas__, 改成兩個(gè)下劃線. 這里還用到了block寫法, 具體看以下代碼:
var view = UIView.alloc().init();
view.setBackgroundColor(UIColor.blueColor());
self.view().addSubview(view);
var weakSelf = __weak(self);
view.mas__makeConstraints(block("MASConstraintMaker*", function(make) {
make.left().equalTo()(weakSelf.view().mas__left()).with().offset()(34);
make.top().equalTo()(weakSelf.view().mas__top()).with().offset()(100);
make.height().with().offset()(100);
make.width().with().offset()(50);
console.log('block is coming');
}));
寫在最后, JSPatch其實(shí)有一個(gè)轉(zhuǎn)換工具, 直接將OC代碼轉(zhuǎn)成JS代碼, 知道的小伙伴不要太激動(dòng), convertor還有bug, 記得盡量避開工具的bug, 暫時(shí)知道的就是寫block的話會(huì)有bug. 可以預(yù)先把oc代碼轉(zhuǎn)一遍, 然后再手動(dòng)改一遍, 即便不是很熟練這套語(yǔ)法, 也可以快速進(jìn)行修復(fù).