前言
JSPatch雖然在兩年前被蘋果郵件警告躺彬,但是ReactNative依然盛行,只不過ReactNative并沒有對Native進行熱修復(fù)的功能梅惯,只是動態(tài)下發(fā)新的bundle模塊宪拥。動態(tài)加載而已。
很多時候線上出現(xiàn)bug铣减,可能是很小她君,很細微的。對此我們可能僅僅需要改動一個返回值就能解決線上bug葫哗。但是實際上我們并沒有這么一套機制去對線上bug進行熱修復(fù)缔刹,只有通過發(fā)版才能解決,這樣對用戶很不友好劣针。
解決方案
Rollout.io 校镐、 JSpatch、 DynamicCocoa捺典、React Native鸟廓、 Weex、Wax 襟己、Hybrid
其實業(yè)界還是有很多方案的 -_-!
看了一下JSPatch的使用文檔引谜,其實就是把JS代碼通過Oc的動態(tài)運行時,將JS方法調(diào)用映射到Oc的對應(yīng)類和方法擎浴。
我們的技術(shù)棧儲備如下:
<objc/runtime>
<objc/message>
JS
js會寫點煌张,ES5就可以。
下面就可以開始退客。按照JSPatch文檔提供的功能骏融,一步一步自己實現(xiàn)對應(yīng)功能链嘀,想一下。以后大家就可以在手機上寫代碼档玻,很刺激吧~
現(xiàn)在開發(fā)成果已經(jīng)可以熱修復(fù)怀泊,熱更新,動態(tài)調(diào)用Oc方法误趴,參數(shù)返回值類型處理霹琼,方法hook
對熱更新、hook凉当、感興趣的同學(xué)可以下載demo玩玩枣申。后續(xù)會跟目前JSPatch支持的功能看齊,但是具體實現(xiàn)是不一樣的哦看杭。大家可以對比一下各自實現(xiàn)的優(yōu)缺點忠藤。
我知道肯定是我寫的low,算是拋磚引玉吧~楼雹,希望大家提問模孩,指正。
Commit問題記錄
1.內(nèi)存問題
解決方式 使用 __unsafe_unretained
修飾臨時變量贮缅,防止 strong
修飾的臨時變量在局部方法結(jié)束時隱式調(diào)用 release
榨咐,導(dǎo)致出現(xiàn)僵尸對象
2.Oc調(diào)用js方法,多參數(shù)傳遞問題
這里面利用arguments和js中的apply
,就可以以多參數(shù)調(diào)用谴供,而不是一個為數(shù)組的obj
對象
3.關(guān)于添加addTarget——action
方法
為View對象添加手勢響應(yīng)以及button添加action時块茁,action(sender){sender為當(dāng)前控制器 self}
為什么Oc
中使用的時候sender
為當(dāng)前的手勢orbutton對象?
如果Native
未實現(xiàn)action
方法桂肌,那么會導(dǎo)致獲取方法簽名失敗而導(dǎo)致我們無法拿到正確參數(shù)数焊,所以獲得的參數(shù)為當(dāng)前self
.
這里要記錄強調(diào)一下,如添加不存在的action
時轴或,要注意action
參數(shù)不為當(dāng)前的事件響應(yīng)者.
4.JS調(diào)用Oc方法,如何支持 多參數(shù)
仰禀、多類型
調(diào)用
首先照雁,我們要講目標Class
的forwardingInvocation:
方法替換成我們自己的實現(xiàn)TTPatch_Message_handle
,
然后通過替換方法的方式答恶,將目標方法的IMP
替換為msg__objc_msgForward
,直接開始消息住轉(zhuǎn)發(fā)饺蚊,這樣直接通過消息轉(zhuǎn)發(fā)最終會運行到我們的TTPatch_Message_handle
函數(shù)中,在函數(shù)中我們可以拿到當(dāng)前正在執(zhí)行方法的invocation
對象悬嗓,這也就意味著我們可以拿到當(dāng)前調(diào)用方法的全部信息污呼,并且可以操作以及修改。我們也是通過這個方法來實現(xiàn)包竹,返回值類型轉(zhuǎn)換燕酷。返回值類型轉(zhuǎn)發(fā)這里涉及到
然后通過替換方法的方式籍凝,將目標方法的IMP
替換為msg__objc_msgForward
,直接開始消息住轉(zhuǎn)發(fā),這樣直接通過消息轉(zhuǎn)發(fā)最終會運行到我們的TTPatch_Message_handle
函數(shù)中苗缩,在函數(shù)中我們可以拿到當(dāng)前正在執(zhí)行方法的invocation
對象饵蒂,這也就意味著我們可以拿到當(dāng)前調(diào)用方法的全部信息,并且可以操作以及修改酱讶。我們也是通過這個方法來實現(xiàn)退盯,返回值類型轉(zhuǎn)換。返回值類型轉(zhuǎn)發(fā)這里涉及的細節(jié)比較多泻肯,暫時只說一下最好的一種解決方案渊迁。
《--------------------Github地址----------------》
上傳一張Demo動態(tài)圖
感興趣的讀者可以下載玩一玩.歡迎提出寶貴意見