iOS開發(fā)JSPatch在線熱修復(fù)技術(shù)簡(jiǎn)介

JSPatch 是一個(gè) iOS 動(dòng)態(tài)更新框架,只需在項(xiàng)目中引入極小的引擎,就可以使用 JavaScript 調(diào)用任何 Objective-C 原生接口,獲得腳本語言的優(yōu)勢(shì):為項(xiàng)目動(dòng)態(tài)添加模塊,或替換項(xiàng)目原生代碼動(dòng)態(tài)修復(fù) bug。

JSPatch 的基本原理就是:JS 傳遞字符串給 OC,OC 通過 Runtime 接口調(diào)用和替換 OC 方法。

JSPatch在App中工作流程:每次啟動(dòng)時(shí)在appDelegate中向服務(wù)器請(qǐng)求js文件,若服務(wù)器上的js文件版本和app本地中的版本不同,證明有新的補(bǔ)丁要執(zhí)行。下載最新的js文件到本地并進(jìn)行熱修復(fù)。

JS如何替換OC代碼:利用OC的消息轉(zhuǎn)發(fā)機(jī)制。(這部分不理解的,出門左轉(zhuǎn)有runtime簡(jiǎn)介)
1、替換原有selector的IMP實(shí)現(xiàn)為一個(gè)空的實(shí)現(xiàn),這樣當(dāng)objc_class接收到消息之后,就會(huì)進(jìn)行消息轉(zhuǎn)發(fā)。
2、將替換的JS方法構(gòu)造一個(gè)JSselector及其IMP實(shí)現(xiàn),添加到當(dāng)前class中
3、然后改寫每個(gè)替換方法類的forwadInvocation的實(shí)現(xiàn)進(jìn)行攔截。如果攔截到的Invocation的selector轉(zhuǎn)換成JSselector能夠響應(yīng),說明正是要被替換的目標(biāo)方法,從Invocation中取出參數(shù)后調(diào)用JSselector的IMP實(shí)現(xiàn)。

簡(jiǎn)單使用demo:
1、前往 http://jspatch.com 平臺(tái)注冊(cè)應(yīng)用獲得appkey及sdk
2、導(dǎo)入JSPatch.framework,libz以及JavaScriptCore.framework
3、若只進(jìn)行本地測(cè)試,在AppDelegate.m中調(diào)用 [JSPatch testScriptInBundle]; 若進(jìn)行服務(wù)器測(cè)試,調(diào)用
[JSPatch startWithAppKey:@""];
//檢查補(bǔ)丁更新
[JSPatch sync];
4、新建main.js文件,編寫補(bǔ)丁的內(nèi)容。
以下代碼演示在線讓ViewController的view的backgroundColor變?yōu)榧t色的js代碼。定義了一個(gè)testJsPatch方法,并在方法里設(shè)置顏色。然后在viewDidLoad方法里調(diào)用。

require('UIColor');
defineClass('ViewController', {
            viewDidLoad: function() {
            self.super().viewDidLoad();
            self.testJsPatch();
            },
            testJsPatch: function() {
            self.view().setBackgroundColor(UIColor.redColor());
            },
            });

不想深入學(xué)習(xí)語法只想使用的同學(xué)可以到https://github.com/bang590/JSPatchConvertor 下載語言轉(zhuǎn)換器,只要寫好oc的代碼,復(fù)制過去就能自動(dòng)生成對(duì)應(yīng)的js代碼。需要注意的是,oc代碼中不能包含NSLog。

使用中的注意點(diǎn):
1、傳輸安全:JS 腳本可以調(diào)用任意 OC 方法,權(quán)限非常大,若被中間人攻擊替換代碼,會(huì)造成較大的危害。
解決方法:使用RSA 校驗(yàn)。

2、執(zhí)行安全:下發(fā)的 JS 腳本靈活度大,相當(dāng)于一次小型更新,若未進(jìn)行充分測(cè)試,可能會(huì)出現(xiàn) crash 等情況對(duì) APP 穩(wěn)定性造成影響。
解決方法:1、不用一次性下發(fā)到所有用戶,逐步下發(fā)。
2、進(jìn)行回退。

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

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

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