iOS如果線下出現(xiàn)bug, 這個好解決, 但如果線上出bug, 由于APP Store提交審核有時間限制, 修改完再提交怎么也得要3-4天, 于是就有了熱修復(fù). 如今熱修復(fù)主要有幾個相對成熟的框架, 一個Bang大神的JSPatch, 一個已停止維護幾年的WaxPatch, 還有一個阿里出品的Ali-Wax. 今天就來學(xué)習(xí)下JSPatch, 學(xué)習(xí)成本較低, 只需簡單的JS語法即可, 而且對oc比較友好, 缺點就是沒有對js友好的編輯器, 當(dāng)然官方出了個xcode的插件, 叫jspatchx, 有興趣的可以試用一下.下面就來學(xué)習(xí)下
JSPatch接入比較簡單, 拖一個framework,添加libz還有JavaScriptCore框架就完成了集成, 相當(dāng)輕量級, 具體教程可以看官方接入文檔
為了熟悉JSPatch的基本用法, 個人思路就是通過JS來寫OC的基本控件學(xué)習(xí)基礎(chǔ). 本人用的sublime text下載地址來編輯JS, 對JS相對友好一些, xcode就有點雞肋的感覺. 在sublime text編輯完之后, 然后cmd + s 保存再運行項目. 開始的時候建議用sublime text新建一個main.js, 然后拖到你的項目里邊, 如圖一, 調(diào)用[JSPatch testScriptInBundle] , 這樣就可以直接在項目中測試JS代碼, JS編輯測試沒問題之后, 就把下面注釋的打開, 如圖一

四. 定義類, 然后引用原來方法, 然后添加新的方法進(jìn)去
defineClass("ViewController",{
viewDidLoad:function(){
self.ORIGviewDidLoad();//引用原來的方法
})
五. 寫一個簡單的Label
defineClass("ViewController",{
viewDidLoad:function(){
self.ORIGviewDidLoad();//引用原來的方法
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);
})
六. 再寫一個簡單的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);
七.寫一個view, 使用Masonry進(jìn)行約束. 需要注意的是, Masonry里面的方法都會帶前綴mas_, 需要轉(zhuǎn)換成mas__, 改成兩個下劃線. 這里還用到了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其實有一個轉(zhuǎn)換工具, 直接將OC代碼轉(zhuǎn)成JS代碼, 知道的小伙伴不要太激動, convertor還有bug, 記得盡量避開工具的bug, 暫時知道的就是寫block的話會有bug. 可以預(yù)先把oc代碼轉(zhuǎn)一遍, 然后再手動改一遍, 即便不是很熟練這套語法, 也可以快速進(jìn)行修復(fù).