IOS 萬能跳轉(zhuǎn)路由系統(tǒng)

由于公司項目的需求,需要做一個APP內(nèi)的路由跳轉(zhuǎn),簡單來說就是根據(jù)后端返回的數(shù)據(jù)動態(tài)跳轉(zhuǎn)到APP內(nèi)任意界面。

剛開始下項目中已有的實現(xiàn)以及第三方庫JLRoutes的實現(xiàn)原理,就是在程序剛開始加載時需要注冊每個你想要跳轉(zhuǎn)到的界面,綁定一個scheme,然后傳遞需要的參數(shù),最后push。

剛開始也是這個思路,但是后面做的時候發(fā)現(xiàn)了挺多問題:

1、需要提前聲明你所有能跳轉(zhuǎn)的界面,或者在能跳轉(zhuǎn)的類中繼承某種方法,產(chǎn)品的需求肯定是他們都不知道跳轉(zhuǎn)到哪個界面(cry~~),所以后面每加一個類都需要去注冊,甚至要在別的方向的類中添加代碼,這太麻煩了。

2、跳轉(zhuǎn)方式各種各樣,需要在跳轉(zhuǎn)之前設(shè)置,比如是push還是present,title是否需要提前設(shè)置,是否需要hidebottom。當(dāng)然這些可以提前通過參數(shù)方式設(shè)置,但是如果后面的版本中突然添加某些控制,那之前的版本兼容又是噩夢。

3、最后,也是最重要的,就是VC的初始化方法,一般初始化參數(shù)的時候都是通過KVC的機制動態(tài)設(shè)置。但是在我們的項目中有些VC的初始化并不是[[VC alloc] init]去初始化的,而是[[VC alloc] initWithObj:obj]的方式,并且這個obj又需要去alloc、init,甚至并不排除obj也有些參數(shù)需要初始化。這樣處理起來就需要用遞歸去初始化每個需要初始化的方法,而且參數(shù)也是循環(huán)嵌套的。用起來及其不方便,解析也容易出錯。

OK,找到這么多問題(鋪墊了這么久)如果沒有解決方法就low了,下面是我的解決以上問題的方法:

后臺下發(fā)js語句,用JSPatch動態(tài)執(zhí)行方法。具體操作是

定義一個RouteManager類,定義跳轉(zhuǎn)方法,傳入后端下發(fā)的encodeString,以及當(dāng)前VC(可以為空,為空則取AppDelegate里的CurrentVC),在方法中啟動JSPatch,執(zhí)行腳本,腳本是替換這個類中的另一個方法,這個方法執(zhí)行體為空就可以,具體執(zhí)行的代碼是JS中跳轉(zhuǎn)的代碼。這樣就可以在后臺動態(tài)上傳需要跳轉(zhuǎn)的界面代碼,其實就是寫OC方法,翻譯成JS腳本。

但是最后還有個坑,就是我無法在JSPatch里獲取上下文中的self(可能JSPatch是提供了這個方法的,但是學(xué)習(xí)時間較短,了解有限,有了解的人歡迎指導(dǎo)),這也是我為什么用hook的原因。

(代碼很簡單,主要是牛逼的JSPatch,所以就不上傳了,有需要的留言留信箱就行)

以上有問題的可以留言,歡迎交流。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容