關(guān)于熱修復(fù)和JSPatch
熱修復(fù)(hot patch)是指不升級(jí)app的情況下蝎困,通過(guò)加載網(wǎng)絡(luò)腳本來(lái)為已上線的App替換或新增功能庵朝。
JSPatch是一個(gè)基于Javascript腳本實(shí)現(xiàn)熱修復(fù)的開源項(xiàng)目鳞尔,JSPatch平臺(tái)打包了一整套腳本上傳垃它、版本管理雅任、腳本請(qǐng)求更新等一系列熱修復(fù)策略笙蒙,提供JSPatch.framework供簡(jiǎn)單使用罕扎。
檢查腳本請(qǐng)求次數(shù)低于50萬(wàn)次每月時(shí)不收取費(fèi)用聚唐。
JSPatch官方網(wǎng)站
開源項(xiàng)目Github-Wiki
實(shí)現(xiàn)原理詳解
基本原理和流程
通過(guò)iOS的JavascriptCore.framework將請(qǐng)求下載的腳本執(zhí)行,以運(yùn)行時(shí)的方式替換舊代碼實(shí)現(xiàn)或者新增功能腔召。
作用的主要流程如下:
- 集成JSPatch.framework
- 檢查當(dāng)前App版本是否有腳本更新
- 下載更新的腳本保存到本地
- 執(zhí)行腳本進(jìn)行熱修復(fù)
JSPatch的集成
下載最新的SDK杆查,JSPatch.framework,目前最新版本為v1.5
將SDK導(dǎo)入工程后臀蛛,需要依賴libz亲桦、JavaScriptCore兩個(gè)庫(kù)
-
調(diào)試模式可以分為兩種,本地導(dǎo)入腳本調(diào)試和線上修復(fù)(兩者不能同時(shí)執(zhí)行)
- 本地調(diào)試:手動(dòng)導(dǎo)入main.js腳本浊仆,
在application:didFinishLaunchWithOptions:方法中執(zhí)行:
[JSPatch testScriptInBundle];
則加載本地腳本執(zhí)行調(diào)試性的熱修復(fù)
- 線上修復(fù):將對(duì)應(yīng)版本的腳本(命名為main.js)上傳到JSPatch平臺(tái)客峭,
在application:didFinishLaunchWithOptions:方法中執(zhí)行:
[JSPatch startWithAppKey:kJSPatchAppKey];
[JSPatch sync];
則會(huì)在啟動(dòng)時(shí)檢查當(dāng)前版本app是否有補(bǔ)丁更新。
- 手動(dòng)調(diào)用檢查補(bǔ)丁更新:
如果對(duì)補(bǔ)丁更新檢查有實(shí)時(shí)性高的要求抡柿,可以手動(dòng)在必要時(shí)調(diào)用[JSPatch sync];方法進(jìn)行補(bǔ)丁更新檢查舔琅,調(diào)用次數(shù)計(jì)入JSPatch的平臺(tái)訪問(wèn)次數(shù),比如在aplicationWillBecomeActive:中進(jìn)行檢查洲劣。
開發(fā)預(yù)覽模式
線上修復(fù)支持開發(fā)預(yù)覽模式备蚓,在app中啟動(dòng)開發(fā)者預(yù)覽模式時(shí)课蔬,只會(huì)檢查和應(yīng)用線上的預(yù)覽模式下的補(bǔ)丁,而不用正式的補(bǔ)丁郊尝,當(dāng)測(cè)試預(yù)覽模式補(bǔ)丁通過(guò)后购笆,可以選擇進(jìn)行全量的正式發(fā)布。
開發(fā)預(yù)覽模式下不會(huì)加載非開發(fā)預(yù)覽模式下補(bǔ)丁虚循,非開發(fā)預(yù)覽模式只會(huì)加載正式補(bǔ)丁同欠。
灰度和條件發(fā)布:
根據(jù)實(shí)際的需要可以進(jìn)行特別的補(bǔ)丁發(fā)布范圍
灰度:隨機(jī)選擇一定比例的用戶進(jìn)行發(fā)布,可不斷提高灰度直至全量發(fā)布
條件發(fā)布:針對(duì)滿足條件的用戶(如設(shè)備類型横缔,系統(tǒng)版本铺遂,或者自定義的用戶參數(shù))進(jìn)行補(bǔ)丁更新,條件發(fā)布命中后不可取消茎刚。(通過(guò)[JSPatch setupUserData:userData]決定當(dāng)前用戶參數(shù))
補(bǔ)丁的管理
在JSPatch平臺(tái)注冊(cè)的app襟锐,按不同的app版本進(jìn)行補(bǔ)丁管理扯旷,支持新增塌忽、更新和刪除補(bǔ)丁蟹瘾,
新增:創(chuàng)建app的某一個(gè)版本堰汉,上傳腳本(命名必須為main.js)
基本用法
編寫main.js文件,定義要修復(fù)的類密浑,導(dǎo)入代碼需要使用的類抵赢,以Javascript的邏輯實(shí)現(xiàn)相關(guān)功能挎挖。
defineClass("ViewController", { // 要修復(fù)的類
badMethod: function() { // 要修復(fù)的方法
console.log("fixed badMethod 1 * 16 release”); // 打印
require(‘UIView') // 導(dǎo)入U(xiǎn)IView
require(‘UIColor') // 導(dǎo)入U(xiǎn)IColor
self.view().setBackgroundColor(UIColor.redColor()); // 修改背景顏色
}
})
更多實(shí)現(xiàn)參考官方文檔
額外功能之在線參數(shù)
在線參數(shù)是獨(dú)立于JSPatch熱修復(fù)之外的在線參數(shù)功能奢入,通過(guò)在JSPatch平臺(tái)設(shè)置好多個(gè)key-value后筝闹,可以在app內(nèi)隨時(shí)提取相關(guān)在線參數(shù)。
關(guān)于JSPatch的安全
- 官方描述
將腳本保存在七牛云腥光,在傳輸過(guò)程中執(zhí)行RSA簽名加密关顷,腳本在本地存儲(chǔ)進(jìn)行了對(duì)稱加密。 - 第三方分析
iOS遠(yuǎn)程hot patch的優(yōu)點(diǎn)和風(fēng)險(xiǎn)
“Hotpatch”潛在的安全風(fēng)險(xiǎn)
demo
加我微信溝通武福。