iOS元件化之路由設計 Router

2022-09-12 00:36:39 字數 3967 閱讀 8181

前言

版本快速迭代:但是使用者依舊不滿意,繼續對開發人員提出了更多更高的要求,不僅需要高質量的使用者體驗,還要求快速迭代,最好一天出乙個新功能,而且使用者還要求不更新就能體驗到新功能。為了滿足使用者需求,於是開發人員就用h5,reactnative,weex等技術對已有的專案進行改造。

③元件化:專案架構也變得更加的複雜,縱向的會進行分層,網路層,ui層,資料持久層。每一層橫向的也會根據業務進行元件化。

儘管這樣做了以後會讓開發更加有效率,更加好維護,但是如何解耦各層,解耦各個介面和各個元件,降低各個元件之間的耦合度,如何能讓整個系統不管多麼複雜的情況下都能保持「高內聚,低耦合」的特點?

1.引子

大前端react和vue.路由的作用主要是保證檢視和url的同步。當使用者在頁面進行操作的時候,應用會在若干個互動狀態中切換,路由則可以記錄下某些重要的狀態,比如使用者檢視乙個**,使用者是否登入、在訪問**的哪乙個頁面。使用者可以通過手動輸入或者與頁面進行互動改變url,然後通過同步或者非同步的方式向服務端傳送請求獲取資源,成功後重新繪製ui。

3->如何能統一ios和android兩端的頁面跳轉邏輯?甚至如何能統一三端的請求資源的方式?

5->如何在每個元件間呼叫和頁面跳轉時都進行埋點統計?每個跳轉的地方都手寫**埋點?利用runtime aop ?

1->url scheme方式

關於系統功能跳轉的url彙總列表

2.universal links 方式

具體設定

2.網域名稱必須要支援https。

在瀏覽器裡面也是一樣的效果,如果是支援了universal links方式,訪問相應的url,會有不同的效果。如下圖:

主要解決:

各個頁面和元件之間的跳轉問題

各個元件之間相互呼叫

**高復用、方便測試

如何設計乙個路由

route實現

主工程與首頁模組、分類、登入模組不直接建立關聯,而是先通過router(路由)與你要呼叫的模組建立關係 ,從而實現各個模組的解耦和復用、

①.octarget_index類(解耦+互動)

#import

ns_assume_nonnull_begin

@inte***ce

octarget_index : nsobject

- (id)action_home:(nsdictionary*)params

;@end

ns_assume_nonnull_end

#import

"octarget_index.h

"#import

@implementation

octarget_index

- (id)action_home:(nsdictionary*)params

@end

2.**實現:hkocrouter.h

#import

ns_assume_nonnull_begin

@inte***ce

hkocrouter : uiview

+(instancetype)shareinstance;

- (id)openurl:(nsstring *)urlstr;

//返回值id,外部呼叫,通過target 和 action 來唯一確認乙個類裡面的方法

- (id)performtarget:(nsstring*)targetname action:(nsstring*)actionname param:(nsdictionary*)params

;@end

ns_assume_nonnull_end

hkocrouter.m

#import

"hkocrouter.h

"@implementation

hkocrouter

+(instancetype)shareinstance );

return

mediator;

}- (id)openurl:(nsstring *)urlstr

}nsstring *actionname = [url.path stringbyreplacingoccurrencesofstring:@"

/" withstring:@""

];

if ([actionname hasprefix:@"

native

"])

id result = [self performtarget:url.host action:actionname param:params

];

return

result;

}-(id)performtarget:(nsstring *)targetname action:(nsstring *)actionname param:(nsdictionary *)params

else

else

}}//

1.通過物件呼叫指定的方法

//2.傳參

- (id)safeperformaction:(sel)action target:(nsobject*)target param:(nsdictionary*)params

//獲取這個方法返回值的位址

const

char *rettype =[methodsig methodreturntype];

//id 是可以返回任意物件,所以我們單獨處理基本變數。 nsinteger bool void

if (strcmp(rettype, @encode(nsinteger)) == 0

)

if (strcmp(rettype, @encode(bool)) == 0

) #pragma clang diagnostic push

#pragma clang diagnostic ignored "-warc-performselector-leaks"

return [target performselector:action withobject:target withobject:params

];#pragma clang diagnostic pop}

@end

使用:

"];index為元件索引;home為actionname;「:」,冒號表示帶引數.

IOS 元件化的好處

建立pod索引庫,固定寫法,並且定義索引庫的名字為s,後續通過s,就能拿到索引庫 pod spec.new do s 設定名稱 設定版本號 s.version 0.0.1 設定摘要 設定詳情 s.description good 設定倉庫主頁 設定許可證 s.license mit 設定作者 s.a...

iOS元件化方案調研

ios元件化方案探索 一 什麼是元件化?1 什麼是元件?元件 一般來說用於命名比較小的功能塊,如 下拉重新整理元件 提示框元件。而較大粒度的業務功能,我們習慣稱之為 模組 如 首頁模組 我的模組 新聞模組。這次討論的主題是元件化,這裡為了方便表述,下面模組和元件代表同乙個意思,都是指較大粒度的業務模...

iOS 元件化(OC篇)

網上關於元件化的理論很多而且已經比較成熟,理論方面請參看這篇集合文章ios元件化。1 要元件化必須進行解耦。我們談解耦,並不是完全解除 之間的耦合,通過學習和實踐這是不合理也不可能的。我們解耦的目的其實是為了解除 模組相互間的依賴,或者說我們的目的就是讓 模組變得單向依賴,像乙個插頭一樣可以自由拔插...