IOS熱修復(fù)之JSPatch

icon

前言


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上提交,也算是新事物吧队萤。

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文件(真的很用心)椎镣。
工具地址

工具演示
文件中的main.js

最后運行項目看看效果吧诈火。

成功修復(fù)了!
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充活。

復(fù)雜點代碼

這里需要注意的是,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啦。

上傳main.js

總結(jié)


總體體驗下來枕赵,JSPatch的使用真的很簡單猜欺!而且作者真的很用心,為開發(fā)者專門設(shè)計了轉(zhuǎn)換工具(對于js三腳貓功夫的我簡直痛哭流涕)拷窜,不愧為IOS熱修復(fù)第一方案开皿。

值得注意的是,有熱修復(fù)就有安全問題篮昧。如果泄露修復(fù)方法赋荆,黑客就能修改你的源代碼,這一點十分恐怖懊昨。JSPatch管理平臺上提供了很多加密方案比如RSA等窄潭,具體的可以自行查看開發(fā)文檔開發(fā)文檔

最后附上目前正在使用的app截圖酵颁,陣容很強大哦~

強大陣容

我是翻滾的牛寶寶狈孔,歡迎大家評論交流~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市材义,隨后出現(xiàn)的幾起案子均抽,更是在濱河造成了極大的恐慌,老刑警劉巖其掂,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油挥,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機深寥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門攘乒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惋鹅,你說我怎么就攤上這事则酝。” “怎么了闰集?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵沽讹,是天一觀的道長。 經(jīng)常有香客問我武鲁,道長爽雄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任沐鼠,我火速辦了婚禮挚瘟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饲梭。我一直安慰自己乘盖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布憔涉。 她就那樣靜靜地躺著订框,像睡著了一般。 火紅的嫁衣襯著肌膚如雪监氢。 梳的紋絲不亂的頭發(fā)上布蔗,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音浪腐,去河邊找鬼纵揍。 笑死,一個胖子當(dāng)著我的面吹牛议街,可吹牛的內(nèi)容都是我干的泽谨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼特漩,長吁一口氣:“原來是場噩夢啊……” “哼吧雹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涂身,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雄卷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛤售,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丁鹉,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡妒潭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揣钦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雳灾。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冯凹,靈堂內(nèi)的尸體忽然破棺而出谎亩,到底是詐尸還是另有隱情,我是刑警寧澤宇姚,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布匈庭,位于F島的核電站,受9級特大地震影響空凸,放射性物質(zhì)發(fā)生泄漏嚎花。R本人自食惡果不足惜寸痢,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一呀洲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啼止,春花似錦道逗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巩那,卻和暖如春吏夯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背即横。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工噪生, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人东囚。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓跺嗽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親页藻。 傳聞我的和親對象是個殘疾皇子桨嫁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容