iOS通過 JSPatch實(shí)現(xiàn) app的熱更新

轉(zhuǎn) ?: ? ??iOS通過 JSPatch實(shí)現(xiàn) app的熱更新

也許也有很多人覺得這是個很高大上的技術(shù),其實(shí)不然,我們只需要在項(xiàng)目里引入極小的引擎文件,就可以使用JavaScript調(diào)用任何 Objective-C 的原生接口,替換任意 Objective-C 原生方法。當(dāng)然呢,目前主要用于下發(fā) JS 腳本替換原生 Objective-C 代碼,實(shí)時修復(fù)線上 bug。

JSPatch的代碼大家可以去github上面下載,具體的安裝與配置方法,你可以去JSPatch的官網(wǎng)進(jìn)行學(xué)習(xí),網(wǎng)址 :?http://jspatch.com

首先說一下JsPatch實(shí)現(xiàn)的內(nèi)部原理:JsPatch能做到通過JS調(diào)用和改寫OC方法最根本的原因是 Objective-C 是動態(tài)語言,OC上所有方法的調(diào)用/類的生成都通過 Objective-C Runtime 在運(yùn)行時進(jìn)行,我們可以通過類名和方法名反射得到相應(yīng)的類和方法,也可以替換某個類的方法為新的實(shí)現(xiàn),還可以新注冊一個類,為類添加方法。這里就不詳細(xì)介紹runtime了,相關(guān)的資料我會在后續(xù)的博客里介紹,大家再等等吧。所以 JSPatch 的原理就是:JS傳遞字符串給OC,OC通過 Runtime 接口調(diào)用和替換OC方法, 重點(diǎn):那如果APP已經(jīng)上架后,出現(xiàn)明顯的bug(比如閃退),你只需要到JSPach官網(wǎng)上傳寫好的js文件就可以搞定了 。這個很容易理解,JS的作用只是一個信使的作用,具體實(shí)現(xiàn)還是得靠我們OC,所以說OC還是世界上最美的語言,哈哈。

同時在這里給大家一個比較好的網(wǎng)站http://bang590.github.io/JSPatchConvertor/.這是一個OC轉(zhuǎn)JS的一個工具網(wǎng)站

下面給大家演示一下具體實(shí)現(xiàn)的步驟

- (void)viewDidLoad{UITableView* tv = [[UITableViewalloc]initWithFrame:self.view.boundsstyle:UITableViewStylePlain];self.mqTableView= tv;self.mqTableView.delegate=self;self.mqTableView.dataSource=self;? ? [self.viewaddSubview:self.mqTableView];}#pragma mark -- UITableViewDataSource- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{return3;}- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{staticNSString* i=@"cell";UITableViewCell* cell = [tableView? dequeueReusableCellWithIdentifier:i];if(cell ==nil) {? ? ? ? cell =[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:i];? ? }? ? cell.textLabel.text=@"meiqing";? ? cell.backgroundColor= [UIColorwhiteColor];returncell;}- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{self.dataSource= @[@"1",@"2"];// 肯定會超出數(shù)組范圍導(dǎo)致 crashNSString*content =self.dataSource[indexPath.row];}

顯示的結(jié)果是這樣的

上面的圖片是沒有修改時候的顯示,當(dāng)我點(diǎn)擊第三行一定會閃退,怎么修復(fù)呢?這個時候就不用發(fā)版本了,服務(wù)器可以給我們傳送一個js文件,文件里的內(nèi)容是這樣的

同時,我們在APPDelegate里調(diào)用這個JS就可以了,如下:

再次運(yùn)行就不會出現(xiàn)閃退了。

整個流程下來其實(shí)挺簡單的,希望大家能夠接受,如果喜歡我的文章,可以關(guān)注我后續(xù)的文章。

附帶github demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容