背景
2017年JSPatch相關App都會收到警告郵件鸭你,提示刪除相關SDK
Apple之所以能揪出JSPatch,則是因為JSPatch中涉及使用到dlopen()喇颁,dlsym()芥被,responsToSelector :、 performSelector:屹逛,method_exchangeImplementations()等方法础废。但實際上我們的項目中也存在上述幾個方法汛骂,依然能過審。所以推測被卡住的原因與這幾個方法相關评腺,但不必然相關帘瞭。
PS:已確認dlsym()函數(shù)會觸發(fā)蘋果的監(jiān)測,造成上線失敗蒿讥。
現(xiàn)在如果引入JSPatch仍然會有被拒的風險蝶念,以下是官方的原話:
JSPatch 平臺使用公告(2019.1.30)
平臺最新 SDK 1.8.2 處于試驗階段,未能確保審核通過芋绸,有意配合試驗者可郵件獲取 SDK媒殉。
SDK 1.8.0 版本有較大概率審核被拒,但企業(yè)版APP可用摔敛,若確認使用可點此下載用平臺最新的 SDK 接入可以通過審核嗎
可以通過廷蓉,已有接入并通過審核的 APP。
為什么平臺 SDK 能通過審核
因為做了簡單的類名修改混淆马昙。
為什么游戲中允許熱更新呢桃犬?
游戲中的熱更新技術主要的實現(xiàn)方式是把動態(tài)腳本下載之后,讓動態(tài)腳本調(diào)用游戲引擎提供的接口實現(xiàn)缺陷修復行楞。與 JSPatch不同的是攒暇,動態(tài)腳本并不能任意調(diào)用全部原生代碼,而是只能根據(jù)游戲引擎提供的接口調(diào)用相關功能子房。在這個過程中形用,游戲引擎的原生端作為一個安全沙箱就轧,提供了一個安全的保護層,只要游戲引擎不要對外提供獲取通訊錄的接口田度,黑客就無法通過替換動態(tài)腳本的方式獲取用戶的隱私資料钓丰。進而可以被認為是安全的,自然就不在蘋果的禁止范圍內(nèi)每币。
解讀規(guī)范
2015 年蘋果發(fā)過一篇協(xié)議《Apple Developer Program License Agreement》携丁,文中第 3.3.2 節(jié)有一段關于熱更新的內(nèi)容:
Except as set forth in the next paragraph, an Application may not download or install executable code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exceptions to the foregoing are scripts and code downloaded and run by Apple's built-in WebKit framework or JavascriptCore, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store.
這一段話大概就是說除了 Webkit 和 JavascriptCore 可以動態(tài)執(zhí)行下發(fā)的腳本和文件,其它所有腳本/代碼/解釋器都必須打包在 APP 內(nèi)部兰怠。這句話其實就給 React Native 留了一個口子:React Native 就是用 JavascriptCore 執(zhí)行 JS 腳本文件的梦鉴,那么動態(tài)下發(fā)也是合理的。
Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS.
這一段話大概就是說揭保,我允許你熱更新肥橙,但是必須遵循我這三條規(guī)定:
- 不能大的修改 APP 功能,導致應用實際功能和 APP Store 的宣傳不符
- 不能動態(tài)創(chuàng)建應用商店
- 不能繞過簽名/沙箱/OS 的安全功能
現(xiàn)在市面上的熱更新方案:
一秸侣、阿里百川hotfix存筏、Sophix、LuaView味榛,騰訊的Bugly椭坚、OCS,滴滴的DynamicCocoa搏色。
- 阿里百川hotfix善茎、Sophix,僅支持安卓
- LuaView频轿,類似于Flutter垂涯,將Android、iOS原生的UI航邢、網(wǎng)絡耕赘、存儲、硬件控制等能力橋接到Lua層膳殷,進行動態(tài)下發(fā)
- Bugly內(nèi)部集成的JSPatch支持的熱更新
- OCS是全新設計的iOS動態(tài)化方案操骡。我們定義了一套精確描述OC語義的字節(jié)碼指令集(OCScript),開發(fā)了一套全自動編譯器(OCSCompiler)秽之,實現(xiàn)了一個高性能的虛擬機(OCSVM)以及一個可以跟底層無縫對接的橋接器(OCSBridge)当娱。我們首先使用OCS編譯器把OC源碼轉(zhuǎn)化成OCS字節(jié)碼,然后通過OCS橋接器實現(xiàn)OCS虛擬機與Native運行時的互聯(lián)考榨,最后使用OCS虛擬機對OCS字節(jié)碼進行解釋運算跨细,并驅(qū)動Native運行時完成邏輯的執(zhí)行,以此達到Native代碼動態(tài)化的效果河质。OCS被用于iOS APP安裝包減包冀惭、功能插件化震叙、HotPatch等方方面面動態(tài)化需求。
- DynamicCocoa 閉源
二散休、Weex媒楼、RN、Hybrid
本身由js編寫的代碼戚丸,自然可以進行js進行bundle拉取
三划址、TTPatch、MangoFix
1.TTPatch
https://github.com/yangyangFeng/TTPatch
(star:420)
TTPatch2.0,核心實現(xiàn)替換為libffi實現(xiàn).同時將代碼重構(gòu),修改敏感命名.TTPatch更新為TTDFKit
官方風險提示: 僅供技術交流使用,上架有風險!!!!
2.MangoFix
https://github.com/YPLiang19/Mango
(star:890)
是DSL即 “領域?qū)S谜Z言”限府,用的是解析器進行詞法夺颤、語法、語義檢查和分析胁勺,作者用到了libffi庫(用于高級語言之間的相互調(diào)用)進行運行時動態(tài)創(chuàng)建C函數(shù)世澜,然后在創(chuàng)建的C函數(shù)中查找MangoFix腳本中方法并調(diào)用(這個用了類似dlsym的symdl進行動態(tài)調(diào)用函數(shù)),然后用剛剛創(chuàng)建的C函數(shù)替換原來Method的IMP指針并保留原有的IMP指針
腳本和OC極度類似署穗,接入和jspatch相似寥裂,有一個下發(fā)腳本的接口,缺點就是下發(fā)完腳本需要重新進入頁面才能更新
參考資料: