iOS熱更新、熱修復方案

##前言
JSPatch雖然在兩年前被蘋果郵件警告,但是ReactNative依然盛行,只不過ReactNative並沒有對Native進行熱修復的功能,只是動態下發新的bundle模塊。動態加載而已。

很多時候線上出現bug,可能是很小,很細微的。對此我們可能僅僅需要改動一個返回值就能解決線上bug。但是實際上我們並沒有這麼一套機制去對線上bug進行熱修復,只有通過發版才能解決,這樣對用戶很不友好。

##解決方案
Rollout.io 、 JSpatch、 DynamicCocoa、React Native、 Weex、Wax 、Hybrid
其實業界還是有很多方案的 -_-!

看了一下JSPatch的使用文檔,其實就是把JS代碼通過Oc的動態運行時,將JS方法調用映射到Oc的對應類和方法。
我們的技術棧儲備如下:

<objc/runtime>
<objc/message>
JS

js會寫點,ES5就可以。

下面就可以開始。按照JSPatch文檔提供的功能,一步一步自己實現對應功能,想一下。以後大家就可以在手機上寫代碼,很刺激吧~

TTPatch開發問題記錄

#現在開發成果已經可以熱修復,熱更新,動態調用Oc方法,參數返回值類型處理,方法hook
對熱更新、hook、感興趣的同學可以下載demo玩玩。後續會跟目前JSPatch支持的功能看齊,但是具體實現是不一樣的哦。大家可以對比一下各自實現的優缺點。
我知道肯定是我寫的low,算是拋磚引玉吧~,希望大家提問,指正。

Commit問題記錄

1.內存問題

解決方式 使用 __unsafe_unretained 修飾臨時變量,防止 strong修飾的臨時變量在局部方法結束時隱式調用 release,導致出現殭屍對象

2.Oc調用js方法,多參數傳遞問題

這裏面利用arguments和js中的apply,就可以以多參數調用,而不是一個爲數組的obj對象

3.關於添加addTarget——action方法

爲View對象添加手勢響應以及button添加action時,action(sender){sender爲當前控制器 self} 爲什麼Oc中使用的時候sender爲當前的手勢orbutton對象?
如果Native未實現action方法,那麼會導致獲取方法簽名失敗而導致我們無法拿到正確參數,所以獲得的參數爲當前self.
這裏要記錄強調一下,如添加不存在的action時,要注意action參數不爲當前的事件響應者.

4.JS調用Oc方法,如何支持 多參數多類型 調用

首先,我們要講目標ClassforwardingInvocation:方法替換成我們自己的實現TTPatch_Message_handle
然後通過替換方法的方式,將目標方法的IMP替換爲msg__objc_msgForward,直接開始消息住轉發,這樣直接通過消息轉發最終會運行到我們的TTPatch_Message_handle函數中,在函數中我們可以拿到當前正在執行方法的invocation對象,這也就意味着我們可以拿到當前調用方法的全部信息,並且可以操作以及修改。我們也是通過這個方法來實現,返回值類型轉換。返回值類型轉發這裏涉及到

然後通過替換方法的方式,將目標方法的IMP替換爲msg__objc_msgForward,直接開始消息住轉發,這樣直接通過消息轉發最終會運行到我們的TTPatch_Message_handle函數中,在函數中我們可以拿到當前正在執行方法的invocation對象,這也就意味着我們可以拿到當前調用方法的全部信息,並且可以操作以及修改。我們也是通過這個方法來實現,返回值類型轉換。返回值類型轉發這裏涉及的細節比較多,暫時只說一下最好的一種解決方案。

《--------------------Github地址----------------》

上傳一張Demo動態圖

TTPatch2.gif

感興趣的讀者可以下載玩一玩.歡迎提出寶貴意見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章