iOS 現(xiàn)在的 “熱修復(fù)/熱更新”

我先來(lái)拋一個(gè)??,為啥蘋(píng)果大大會(huì)禁用JSPatch的“熱更新”抓狭?以及iOS統(tǒng)計(jì)現(xiàn)階段可以通過(guò)審核的“熱更新”否过。
這個(gè)磚會(huì)在文中進(jìn)行探究和解答惭蟋。

首先,在那2017年3月8…煤伟,記得那是給女神過(guò)節(jié)的那一天便锨,蘋(píng)果爸爸大刀闊斧的砍向了JSPatch領(lǐng)銜的JS動(dòng)態(tài)代碼映射技術(shù)氨肌,頓時(shí)怎囚,感覺(jué)iOS熱更技術(shù)要變天恳守,之后類似各家大廠SDK中使用了JSPatch的都紛紛移除相關(guān)代碼讓開(kāi)發(fā)者進(jìn)行更新催烘,直到現(xiàn)在JSPatch發(fā)布的1.8.0版本公告中說(shuō)明都會(huì)大概率被拒,1.8.2的版本則在試驗(yàn)過(guò)程中:


image.png

但是為什么游戲中的熱更新技術(shù)不會(huì)受到蘋(píng)果的禁止考杉,作為一名技術(shù)人員崇棠,不討論其他角度的問(wèn)題,只從技術(shù)角度來(lái)看询刹,為什么 JSPatch蘋(píng)果認(rèn)為是不允許的凹联,而游戲引擎的熱更新技術(shù),蘋(píng)果認(rèn)為是可以的呢蔽挠?
其實(shí)就是JSPatch能夠?qū)λ械?Objective-C 的 API 進(jìn)行映射象泵,允許開(kāi)發(fā)者在 JS 端調(diào)用任意原生代碼,這會(huì)造成重大的安全隱患問(wèn)題朗涩。
游戲中的熱更新技術(shù)主要的實(shí)現(xiàn)方式是把動(dòng)態(tài)腳本下載之后谢床,讓動(dòng)態(tài)腳本調(diào)用游戲引擎提供的接口實(shí)現(xiàn)缺陷修復(fù)识腿。與 JSPatch不同的是造壮,動(dòng)態(tài)腳本并不能任意調(diào)用全部原生代碼耳璧,而是只能根據(jù)游戲引擎提供的接口調(diào)用相關(guān)功能旨枯。在這個(gè)過(guò)程中,游戲引擎的原生端作為一個(gè)安全沙箱皂贩,提供了一個(gè)安全的保護(hù)層,只要游戲引擎不要對(duì)外提供獲取通訊錄的接口婴栽,黑客就無(wú)法通過(guò)替換動(dòng)態(tài)腳本的方式獲取用戶的隱私資料居夹。進(jìn)而可以被認(rèn)為是安全的准脂,自然就不在蘋(píng)果的禁止范圍內(nèi)狸膏。


WeChatb0d520737ce3a66f1da7b3cc7e46af6c.png

??總的來(lái)說(shuō):蘋(píng)果認(rèn)為JSPatch這個(gè)使用了dlopen(), dlsym(), respondsToSelector:, performSelector:湾戳,method_exchangeImplementations() 等反射函數(shù)動(dòng)態(tài)調(diào)用OC的API是危險(xiǎn)的砾脑,那現(xiàn)在iOS還有熱更新嗎韧衣,答案是肯定的,而且還不少购桑,但是大部分都是JS開(kāi)發(fā)的項(xiàng)目畅铭,這些項(xiàng)目肯定是可以熱更的,那iOS熱更有哪些呢勃蜘,哪些是原生的呢硕噩,接下來(lái)我們就探究一下“市面上的熱更新/熱修復(fù)”。??????(當(dāng)然缭贡,企業(yè)賬號(hào)就用JSPatch就可以了)

一炉擅、游戲類的熱修復(fù)

像老的cocos2dx和新的creater,還有u3d都用的lua腳本拉仍裙椤坑资;

二、阿里百川Fix

原生可接入的SDK穆端,這個(gè)條件是需要20萬(wàn)的日活袱贮,才會(huì)給SDK;

三、Weex嗽仪、RN兢孝、Hybrid等

本身由js編寫(xiě)的代碼,自然可以進(jìn)行js進(jìn)行bundle拉取

四窗轩、TTPatch、MangoFix等修復(fù)

https://github.com/yangyangFeng/TTPatch
https://github.com/YPLiang19/Mango
兩個(gè)方案原生可都接入

TTPatch:是JSPatch的一個(gè)簡(jiǎn)化版,用的是js的解釋器镀岛,支持的語(yǔ)法也比較全面卸留,底層原理和JSPatch是差不多的喳整,中間通過(guò)替換方法的方式,將目標(biāo)方法的IMP替換為_(kāi)objc_msgForward熬尺,直接開(kāi)始消息轉(zhuǎn)發(fā),然后在經(jīng)過(guò)resolveInstanceMethod 、forwardingTargetForSelector、methodSignatureForSelector到forwardInvocation里獲取到執(zhí)行方法的invocation對(duì)象艺挪,之后進(jìn)行操作以及替換器钟,不支持swift熱修復(fù)(可以集成用于動(dòng)態(tài)添加類)。

MangoFix:是DSL即 “領(lǐng)域?qū)S谜Z(yǔ)言”穆役,用的是解析器進(jìn)行詞法韧拒、語(yǔ)法、語(yǔ)義檢查和分析,作者用到了libffi庫(kù)(用于高級(jí)語(yǔ)言之間的相互調(diào)用)進(jìn)行運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建C函數(shù),然后在創(chuàng)建的C函數(shù)中查找MangoFix腳本中方法并調(diào)用(這個(gè)用了類似dlsym的symdl進(jìn)行動(dòng)態(tài)調(diào)用函數(shù)颂鸿,
)栽渴,然后用剛剛創(chuàng)建的C函數(shù)替換原來(lái)Method的IMP指針并保留原有的IMP指針墅冷,?? y1u1這個(gè)方案確實(shí)不錯(cuò),在語(yǔ)法上類似OC語(yǔ)法辖佣,上手挺快,但缺點(diǎn)也很顯著凸郑,畢竟解析方式都是作者寫(xiě)的救氯,在語(yǔ)法上支持的不全面务嫡,比如rac的語(yǔ)法就很頭疼去扣,不支持swift熱修復(fù)(可以集成用于動(dòng)態(tài)添加類)或链。

??總結(jié)一下:游戲的熱修復(fù)指望不上,阿里和騰訊的SDK門(mén)檻點(diǎn)兒高令宿,Weex叼耙、RN筛婉、Hybrid這三種方案原生App只能看看爽撒,則最后的兩種方案原生可以集成使用扼褪,目前均可以上架闹究,筆者用的就是MangoFix做的小功能熱修復(fù)刻伊,如果沒(méi)有拉取到需要修復(fù)腳本可以不初始化熱修復(fù)模塊晨川,腳本信息加密然后拉取到沙盒后解密加載证九。

補(bǔ)充:使用stinger進(jìn)行aop的方案也可以實(shí)現(xiàn)熱修復(fù)/熱更新。
補(bǔ)充:flutter 官方聲明是暫時(shí)不支持熱更新的共虑,但是flutter支持web開(kāi)發(fā)愧怜,于是“flutter+web技術(shù)對(duì)接”這個(gè)熱更方案出來(lái)了,大致上是還是用js加載更新方案妈拌。

其他

  1. 說(shuō)明:
    總結(jié)不對(duì)的地方歡迎糾正?? 拥坛,本文僅供用于學(xué)習(xí)參考。

  2. 參考資料:
    TTPatch :https://github.com/yangyangFeng/TTPatch
    MangoFix :https://github.com/YPLiang19/Mango
    MangoFix原理分析 :http://www.reibang.com/p/a6511c687eda
    動(dòng)態(tài)調(diào)用&定義C函數(shù):http://www.reibang.com/p/92d4c06223e7
    Unity3D游戲輕量級(jí)xlua熱修復(fù)框架 :https://www.cnblogs.com/SChivas/p/7893048.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尘分,一起剝皮案震驚了整個(gè)濱河市猜惋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌培愁,老刑警劉巖著摔,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異竭钝,居然都是意外死亡梨撞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)香罐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卧波,“玉大人,你說(shuō)我怎么就攤上這事庇茫「哿唬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵旦签,是天一觀的道長(zhǎng)查坪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)宁炫,這世上最難降的妖魔是什么偿曙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮羔巢,結(jié)果婚禮上望忆,老公的妹妹穿的比我還像新娘。我一直安慰自己竿秆,他們只是感情好启摄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著幽钢,像睡著了一般歉备。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匪燕,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天蕾羊,我揣著相機(jī)與錄音,去河邊找鬼谎懦。 笑死肚豺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的界拦。 我是一名探鬼主播吸申,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼享甸!你這毒婦竟也來(lái)了截碴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛉威,失蹤者是張志新(化名)和其女友劉穎日丹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蚯嫌,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哲虾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年丙躏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片束凑。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晒旅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汪诉,到底是詐尸還是另有隱情废恋,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布扒寄,位于F島的核電站鱼鼓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏该编。R本人自食惡果不足惜迄本,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望上渴。 院中可真熱鬧岸梨,春花似錦、人聲如沸稠氮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隔披。三九已至赃份,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奢米,已是汗流浹背抓韩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鬓长,地道東北人谒拴。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涉波,于是被迫代替她去往敵國(guó)和親英上。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354