【iOS】什么孵奶?不編譯就可以更新代碼

項(xiàng)目地址

https://github.com/xurunkang/NO_COMPILE

前言

對于 iOS 的中大型項(xiàng)目來說司忱,編譯耗時的問題永遠(yuǎn)是一個痛點(diǎn)。緩解的方案有許多:ccache 等緩存方案 / 優(yōu)化 Xcode 配置 / 加錢堆硬件锄蹂。
這些方案的出發(fā)點(diǎn)都是基礎(chǔ)優(yōu)化編譯耗時來解決的氓仲,哪有沒有一個辦法可以做到不編譯就執(zhí)行修改后的代碼呢?
基于 Objective-C 的動態(tài)特性,是完全可以做到這一點(diǎn)的敬扛,這也是各種熱修復(fù)框架的支撐原理之一晰洒。那么如果需要做到不編譯就執(zhí)行修改后的代碼,我們可以這樣做:獲取本地修改后代碼 -> 轉(zhuǎn) JavaScript 或 Lua -> 模擬器執(zhí)行修改后的腳本啥箭。

大致思路

獲取本地修改代碼

這里也有許多方法谍珊,可以手動復(fù)制,也可以自動獲取急侥。這里我是選擇利用 Xcode Editor Extension 來獲取到你選中的修改代碼的砌滞。

Objective-C 轉(zhuǎn) JavaScript

由于整個流程我是基于 JSPatch 來開發(fā)的,所以是需要轉(zhuǎn)為 JS 的腳本坏怪。這里我是寫了個 node.js 的腳本來實(shí)現(xiàn)贝润,轉(zhuǎn)換算法是利用 https://github.com/bang590/JSPatchConvertor 中的開源代碼。

模擬器執(zhí)行修改后的腳本

由于已經(jīng)有 JSPatch 完整的框架做支撐铝宵,這里只需要利用其中的方法 -[JPEngine evaluateScriptWithPath:] 去執(zhí)行修改后的腳本即可打掘。

具體實(shí)現(xiàn)流程圖

流程圖
  1. 項(xiàng)目和本地 Node 服務(wù)器建立 Socket 連接
  2. 修改 test 代碼
  3. 利用 Xcode Editor Extension 獲取修改的代碼
  4. 將修改代碼發(fā)送到本地 Node 服務(wù)器
  5. 執(zhí)行 Node 腳本將 OC 轉(zhuǎn) JS
  6. 執(zhí)行 Node 腳本將 JS 寫入到本地文件
  7. 利用 Socket 通知項(xiàng)目更新
  8. 項(xiàng)目執(zhí)行 -[JPEngine evaluateScriptWithPath:] 函數(shù)注入 JS 代碼
  9. 重新執(zhí)行 test 代碼

(我是從零開始的啊,為什么markdown就要轉(zhuǎn)為1呢~)

這里使用 Node.js 有兩個原因:Xcode Editor Extension 不支持直接執(zhí)行沙盒外腳本(所以是通過 Extension 向 Node 服務(wù)器發(fā)送 Http 請求來傳遞修改的代碼),而且和 iOS 模擬器進(jìn)行進(jìn)程通信比較麻煩(嘗試了 CFNotification 等幾種方法都不行鹏秋,所以使用 Node 搭建 Socket 服務(wù)器達(dá)到進(jìn)程通信)尊蚁。

視頻演示

http://ocnnxadky.bkt.clouddn.com/KK_NO_COMPILE_DEMO.mp4

缺陷

自動轉(zhuǎn)換腳本目前不支持如下類型:

Macro / constant variable / Enum
C function calling
GCD functions
Pointer / Struct
Getting / Setting private variable
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侣夷,隨后出現(xiàn)的幾起案子横朋,更是在濱河造成了極大的恐慌,老刑警劉巖百拓,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶撒,死亡現(xiàn)場離奇詭異,居然都是意外死亡耐版,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門压汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粪牲,“玉大人,你說我怎么就攤上這事止剖∠傺簦” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵穿香,是天一觀的道長亭引。 經(jīng)常有香客問我,道長皮获,這世上最難降的妖魔是什么焙蚓? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上购公,老公的妹妹穿的比我還像新娘萌京。我一直安慰自己,他們只是感情好宏浩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布知残。 她就那樣靜靜地躺著,像睡著了一般比庄。 火紅的嫁衣襯著肌膚如雪求妹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天佳窑,我揣著相機(jī)與錄音制恍,去河邊找鬼。 笑死华嘹,一個胖子當(dāng)著我的面吹牛吧趣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耙厚,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼强挫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了薛躬?” 一聲冷哼從身側(cè)響起俯渤,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎型宝,沒想到半個月后八匠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趴酣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年梨树,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岖寞。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡抡四,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仗谆,到底是詐尸還是另有隱情指巡,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布隶垮,位于F島的核電站藻雪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狸吞。R本人自食惡果不足惜勉耀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一指煎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑰排,春花似錦贯要、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至京郑,卻和暖如春宅广,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背些举。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工跟狱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人户魏。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓驶臊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叼丑。 傳聞我的和親對象是個殘疾皇子关翎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容