前言
IOS熱修復(fù)一直是關(guān)注的重點之一窖贤。由于appstore的審核上架機制的局限勺择,新發(fā)布的版本往往要等待很長時間才能上架。如果舊版本有重大bug涩嚣,并且用戶不更新崇众,那么安裝了有bug版本的用戶永遠(yuǎn)都不能修復(fù)(不可挽回的失誤)。
所謂熱修復(fù)航厚,就是不需要重新上架就修復(fù)線上bug顷歌。去年比較流行的React Native
可以解決這一問題。但是React Native
需要用JS
編寫代碼幔睬,這一點對于我來說還是很不情愿的眯漩。
IOS熱修復(fù)技術(shù)我一直認(rèn)為很不成熟,但是當(dāng)我使用JSPatch
的時候,我的觀念完全改變了赦抖,這簡直就是不可多得的神器舱卡!JSPatch
是去年3月份第一次在GitHub上提交,也算是新事物吧队萤。
JSPatch簡介
JSPatch 可以讓你用 JavaScript 書寫原生 iOS APP轮锥。只需在項目引入極小的引擎,就可以使用 JavaScript 調(diào)用任何 Objective-C 的原生接口要尔,獲得腳本語言的優(yōu)勢:為項目動態(tài)添加模塊舍杜,或替換項目原生代碼動態(tài)修復(fù) bug。
作者Bang (以前一直覺得Bang博客很有清爽赵辕,特別喜歡既绩,沒想到是JSPatch的作者。还惠。)
cocoaPods安裝:
pod 'JSPatchSDK', '~> 1.5.2'
gitHub地址:https://github.com/bang590/JSPatch/blob/master/README-CN.md
實現(xiàn)原理:可以參考唐巧的文章戳這里
腳本管理平臺:http://jspatch.com/
objective-c轉(zhuǎn)js工具:轉(zhuǎn)換工具
JSPatch實戰(zhàn)體驗(線下)
首先我們創(chuàng)建一個簡單的項目熬词,導(dǎo)入podFile,然后添加一個Label,添上約束吸重,隨便寫點字互拾。代碼如下:
- (void)viewDidLoad {
[super viewDidLoad];
self.testLabel.text = @"this is a bug";
}
然后在AppDelegate.m
中寫上頭文件和代碼#import <JSPatch/JSPatch.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//線下使用這個代碼,系統(tǒng)會自動查找項目中的main.js文件嚎幸,然后完成熱修復(fù)
[JSPatch testScriptInBundle];
return YES;
}
最后在項目中添加main.js
文件颜矿,里面寫上js代碼,運行就好了嫉晶。不知道怎么寫js骑疆?作者早就考慮到了這點,為了方便開發(fā)者替废,作者寫了一個oc轉(zhuǎn)js的腳本工具箍铭,只要在左側(cè)寫入oc代碼,右邊就能裝換成符合規(guī)范的js文件(真的很用心)椎镣。
工具地址
最后運行項目看看效果吧诈火。
defineClass('ViewController', {
viewDidLoad: function() {
self.super().viewDidLoad();
self.testLabel().setText("Hot Fix!");
},
});
從js代碼我們可以得出JSPatch
的實現(xiàn)原理状答。首先找到ViewController
類冷守,再找到viewDidLoad:
方法,將js
用正則匹配或者其他方法轉(zhuǎn)換成oc代碼惊科,在通過runtime
機制將viewDidLoad:
替換成新的方法拍摇,這樣就實現(xiàn)了熱修復(fù)。
我們再寫點復(fù)雜的代碼馆截,給view上加一個Label充活。
這里需要注意的是,CGRectMake
等結(jié)構(gòu)體轉(zhuǎn)成js的時候,工具并不能幫我們轉(zhuǎn)換成功混卵,這也是一處Bug吧映穗。可以參考文檔:文檔
正確代碼如下:
require('UILabel,UIColor');
defineClass('ViewController', {
viewDidLoad: function() {
self.super().viewDidLoad();
self.testLabel().setText("hotFix!");
var label = UILabel.alloc().initWithFrame({x:100, y:100, width:100, height:100});
label.setText("hello World");
label.setBackgroundColor(UIColor.redColor());
self.view().addSubview(label);
},
});
效果:
JSPatch實戰(zhàn)體驗(線上)
熱修復(fù)淮菠,當(dāng)然在線上測試才有意義男公。首先登入JSPatch平臺(有能力的完全可以自己搭建)http://jspatch.com/注冊一個賬號荤堪,申請一個appKey合陵。
然后修改AppDelegate.m
里的方法,改成線上測試澄阳。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JSPatch startWithAppKey:@"728a7c0548d35106"];
#ifdef DEBUG
[JSPatch setupDevelopment];
#endif
[JSPatch sync];
// [JSPatch testScriptInBundle];
return YES;
}
把工程里的main.js
移出工程拥知,上傳到平臺上。這樣就完成了碎赢,線上的配置低剔。運行代碼,第一次還是顯示this is a bug肮塞,因為工程要把線上的main.js
文件下載到本地襟齿。第二次進(jìn)入就能看見hot Fix啦。
總結(jié)
總體體驗下來枕赵,JSPatch
的使用真的很簡單猜欺!而且作者真的很用心,為開發(fā)者專門設(shè)計了轉(zhuǎn)換工具(對于js三腳貓功夫的我簡直痛哭流涕)拷窜,不愧為IOS熱修復(fù)第一方案开皿。
值得注意的是,有熱修復(fù)就有安全問題篮昧。如果泄露修復(fù)方法赋荆,黑客就能修改你的源代碼,這一點十分恐怖懊昨。JSPatch管理平臺上提供了很多加密方案比如RSA等窄潭,具體的可以自行查看開發(fā)文檔開發(fā)文檔。
最后附上目前正在使用的app截圖酵颁,陣容很強大哦~
我是翻滾的牛寶寶狈孔,歡迎大家評論交流~