JSPatch使用小記

hotfix的作用眾所周知姜胖,Android和iOS都有各自的技術(shù)朴艰,但是相比Android的當天發(fā)布來說(如果你們的項目不需要灰度)法焰,iOS熱更新的意義更加重大。因為iOS審核周期長不說谭企,而且運氣不好會遇到各種被拒廓译,即使申請快速審核,也必須滿足二者之一:能夠準確的告訴蘋果復(fù)現(xiàn)crash的步驟赞咙,或者在特殊節(jié)日附近责循。 可能你費勁周折的提心吊膽和那么多天其實?也就是在某個類中加三行代碼糟港。

1.簡單介紹

在沒有JSPatch之前攀操,可能有人會使用過JSCocoa。但是有著一系列復(fù)雜問題秸抚,比如源碼已經(jīng)多年沒有維護速和,代碼規(guī)模巨大,不支持ARM64剥汤。如果想使用還需要升級libffi颠放,并且嘗試兼容ARM64,想編譯通過都很困難吭敢。

JSPatch的出現(xiàn)基本解決了上述所有問題碰凶。在一個項目中接入JSPatch的成本很低,?需要動點腦筋的可能就是如何合理的提交和下載鹿驼。

關(guān)于JSPatch的原理作者的博客已經(jīng)說的很清楚欲低,本文不再說明,本文主要說的時一些接入操作相關(guān)畜晰。

如果你不是在董鉑然博客園看到本文可點擊查看原文砾莱。

2.倉庫設(shè)置

js文件肯定不能隨便往后臺某個文件夾一放就讓前端去下載了,雖然使用方便但是在App或者版本較多時容易混亂凄鼻。建議專門搭建一個遠端倉庫腊瑟,倉庫里主要就是文件夾和js文件聚假,當需要提交js文件時,從主干遷出一個分支闰非,在合適的地方新建文件夾并添加js文件膘格,然后給主干提Pull Request, 這應(yīng)該是一個麻煩但是規(guī)范的流程财松。文件夾結(jié)構(gòu)參考下圖:

第三層文件夾里闯袒,可以用版本名稱也可以使用build號。之后在發(fā)請求下載的時候應(yīng)該是需要拼上項目appname游岳,version等參數(shù)政敢。

3.?安全策略

安全相關(guān)工作如果沒有做好,最慘的情況是人家可以通過js文件調(diào)用你的任何OC方法胚迫,我們肯定不能允許此類事情發(fā)生喷户。一般在js文件提交到倉庫以后后端應(yīng)該對這一段js代碼進行 md5或者更高手段的編碼,并將這段編碼與文件存在一起访锻,上圖中得meta.json里存的就是這一段編碼褪尝。 之后在發(fā)請求的返回值的結(jié)構(gòu)應(yīng)該是大致如下

{

data: {

isUpdate:true,

content: "require('MTPoiFeedbackM')

defineClass('MTFeedbackRankCell',{

setPoiFeedback:function(poiFeedback){

self.ORIGsetPoiFeedback(poiFeedback)

var temColor = require('UIColor').lightGrayColor();

self.detailLbl().setTextColor(temColor);

}

})",

code:"9c944f39e57f2e50bdb85deb878cc0f798efb9b0"

}

}

就是首先有個字段告訴我們較上次下載的js文件是否有更新。如果為true再檢測下方返回的code與內(nèi)容編碼后得到的code是否相同期犬。當然這個內(nèi)容也可以不直接返回而是返回一個下載的url也是完全可以的河哑。

4.更新頻率

我之前看到很多人把使用js和下載js的代碼都放在了didFinishLaunchingWithOptions:這個方法。我覺得有所不妥龟虎,因為如果這個app用戶一直放在手機的后臺(比如微信)璃谨,并且也沒出現(xiàn)內(nèi)存警告的話,這個方法應(yīng)該一直不會調(diào)用鲤妥。我建議的是:使用js文件的代碼放在didFinishLaunchingWithOptions: 而下載js文件的代碼放在applicationDidBecomeActive: 因為這個方法在程序啟動和后臺回到前臺時都會調(diào)用佳吞。并且我建議設(shè)置一個間隔時間,根據(jù)一些?數(shù)據(jù)和權(quán)衡之后我們采用的是間隔時間設(shè)為1小時棉安。 也就是說每次來到這個方法時底扳,先要檢測是距離上次發(fā)請求的時間間隔是否超過1小時,超過則發(fā)請求贡耽,否則跳過衷模。

5.接入流程

接入的方式很簡單,作者也提供了Demo程序蒲赂,大致就分為幾步:

①在General 的 LinkFrameworks and Libraries里面 添加javascriptcore.framework

這個庫里主要用于js與oc語言的橋接阱冶,比如一些數(shù)據(jù)類型間的相互轉(zhuǎn)化。

②podfile添加pod'JSPatch' 并pod install

③在代碼中添加使用js和下載js的代碼

這里作者也給出了示例凳宙,使用和下

[JPEngine startEngine];

NSString*sourcePath = [[NSBundlemainBundle] pathForResource:@"demo"ofType:@"js"];

NSString*script = [NSStringstringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncodingerror:nil];

[JPEngine evaluateScript:script];

4[NSURLConnectionsendAsynchronousRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:@"http://cnbang.net/test.js"]] queue:[NSOperationQueuemainQueue] completionHandler:^(NSURLResponse*response,NSData*data,NSError*connectionError) {

NSString*script = [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding];

[JPEngine evaluateScript:script];

}];

但是如果你是企業(yè)級app熙揍,肯定不能直接使用這么樸素的方式,肯定至少也要封裝一個manager之類的氏涩。我們公司的源碼不會在這里貼出來届囚,但是提供一個建立這個manager大概的思路:

6.JSPatch語法

這里是作者列出的語法總結(jié):作者原文不用刻意去看有梆,在寫的過程中逐漸就熟悉了。

下面給出一段示例代碼解決兩個簡單的bug意系。

①假設(shè)有一個按鈕我們默認應(yīng)該是讓他不可點擊的泥耀,但是之前忘了設(shè)置。

OC代碼

- (void)viewWillAppear:(BOOL)animated

{

[superviewWillAppear:animated];

self.confirm.enabled =NO;

}

jspatch

defineClass('MTBRegisterPage',{

viewWillAppear: function(animated) {

self.super().viewWillAppear(animated);

self.confirm().setEnabled(NO);

}

})

②假設(shè)有一個列表頁?有特殊情況臨時想叫我們由黑色改成灰色蛔添,并展示一個彈窗

OC代碼

- (void)setDealFeedback:(MTDealFeedbackM *)dealFeedback

{

// ------先調(diào)用原來的方法痰催,舊代碼保留

self.detailLbl.textColor = [UIColor lightGrayColor];

UIAlertView *temAlertView = [[UIAlertView alloc]initWithTitle:@"提示"message:@"已購物品用灰色展示"delegate:selfcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];

[temAlertView show];

}

jsPatch

require('MTPoiFeedbackM')

defineClass('MTFeedbackRankCell',{

setPoiFeedback:function(poiFeedback){

self.ORIGsetPoiFeedback(poiFeedback)

var temColor = require('UIColor').lightGrayColor();

self.detailLbl().setTextColor(temColor);

var temAlertView = require('UIAlertView').alloc().

initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles("提示","已購物品用灰色展示",self,"OK", null);

temAlertView.show()

}

})

諸如此類的代碼,覺得在使用的過程中出現(xiàn)頻率最高的bug迎瞧,就是調(diào)用原方法然后加一個判斷用來容錯或return夸溶。

也許作者也覺得畢竟這個JSPatch語法 并不是一個正式的語種,大家不會投入太大的精力來仔細學(xué)習凶硅,所以作者本人也提供了一個簡單粗暴的OC到JS直接轉(zhuǎn)換地址:http://bang590.github.io/JSPatchConvertor/

這個地址親測一些簡單的寫法是正確轉(zhuǎn)換的缝裁,但是比較復(fù)雜的語法還是不能讓機器直接搞定,還是需要人工修改的足绅。作者也在不斷完善這個工具捷绑。 這個轉(zhuǎn)換器的實現(xiàn)原理:http://blog.cnbang.net/tech/2915/

7.更多思考

①.接入了JSPatch之后,iOS的線上BUG 看上去就不向以前那樣“猛如虎”了氢妈,但是這僅僅是一個緊急預(yù)案措施粹污,以前規(guī)范的流程還是需要遵守。

②.每一次本版本用JSPatch解決的線上Bug首量,下個版本必須用OC代碼寫入項目中壮吩,不能允許補丁代碼的存留超過一個版本。

③.倡導(dǎo)使用敏捷開發(fā)的思想蕾总,類似于主邏輯或者是功能模塊入口的方法可以抽的更細粥航,這樣即使需要修改,成本也不會太大生百,作者本人也提到,如果有一行代碼必須要在一個大方法的中間進行修改柄延,那我也沒辦法了蚀浆,你只能把這整個方法都用js寫一遍了,所以才設(shè)置了JSPatchConvertor搜吧。

④.每次用JSPatch解決掉的線上BUG 應(yīng)當有一個專門的文檔記錄市俊,遇到重復(fù)錯誤必須寫casestudy。

?暫時想到這些滤奈,希望本文能對準備接入JSPatch的開發(fā)人員有所幫助摆昧。

轉(zhuǎn)載:http://www.cnblogs.com/dsxniubility/p/5080875.html

如果你不是在董鉑然博客園看到本文可點擊查看原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜒程,一起剝皮案震驚了整個濱河市绅你,隨后出現(xiàn)的幾起案子伺帘,更是在濱河造成了極大的恐慌,老刑警劉巖忌锯,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伪嫁,死亡現(xiàn)場離奇詭異,居然都是意外死亡偶垮,警方通過查閱死者的電腦和手機张咳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似舵,“玉大人脚猾,你說我怎么就攤上這事⊙饣” “怎么了婚陪?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長频祝。 經(jīng)常有香客問我泌参,道長,這世上最難降的妖魔是什么常空? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任沽一,我火速辦了婚禮,結(jié)果婚禮上漓糙,老公的妹妹穿的比我還像新娘铣缠。我一直安慰自己,他們只是感情好昆禽,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布蝗蛙。 她就那樣靜靜地躺著,像睡著了一般醉鳖。 火紅的嫁衣襯著肌膚如雪捡硅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天盗棵,我揣著相機與錄音壮韭,去河邊找鬼。 笑死纹因,一個胖子當著我的面吹牛喷屋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞭恰,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屯曹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恶耽,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤密任,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驳棱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體批什,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年社搅,在試婚紗的時候發(fā)現(xiàn)自己被綠了驻债。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡形葬,死狀恐怖合呐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笙以,我是刑警寧澤淌实,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站猖腕,受9級特大地震影響拆祈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倘感,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一放坏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧老玛,春花似錦淤年、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至镜廉,卻和暖如春弄诲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桨吊。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工威根, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人视乐。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像敢茁,于是被迫代替她去往敵國和親佑淀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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