一介陶、簡介
1. 使用場景
- deep link:通過 Custom URL Scheme 由外部跳轉(zhuǎn)到 app,比如推送跳轉(zhuǎn)乌询,app 間跳轉(zhuǎn)肪虎。
- app 內(nèi)部路由跳轉(zhuǎn):使用中介者模式對 controller 進行解耦。
2. 使用方法
在 APP 啟動時注冊 URL:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
JLRoutes *routes = [JLRoutes globalRoutes];
[routes addRoute:@"/user/view/:userID" handler:^BOOL(NSDictionary *parameters) {
NSString *userID = parameters[@"userID"]; // defined in the route by specifying ":userID"
// present UI for viewing user with ID 'userID'
return YES; // return YES to say we have handled the route
}];
return YES;
}
打開 URL:
NSURL *viewUserURL = [NSURL URLWithString:@"myapp://user/view/joeldev"];
[JLRoutes routeURL:viewUserURL];
詳見該項目的 README哮幢。
二淆储、主要原理
1.注冊流程
調(diào)用 addRoute:handler:
方法注冊 url scheme,保存/取出每個 scheme 對應(yīng)的 routes controller 對象(以 key-value 形式保存的)家浇;注冊 url pattern,按優(yōu)先級將每個 pattern 對應(yīng)的 JLRRouteDefinition(封裝 pattern碴裙、priority钢悲、回調(diào) block 等數(shù)據(jù))通過插入排序的方式保存到數(shù)組中,這里一個 pattern 可能對應(yīng)一個或者多個 JLRRouteDefinition舔株。
[圖片上傳失敗...(image-121211-1517495654112)]
圖 1. 注冊 URL 流程
2. 解析 URL 流程
調(diào)用 routeURL:
方法喚起 URL時莺琳,取出 scheme 對應(yīng)的 routes controller,生成 JLRRouteRequest载慈,然后遍歷所有注冊過的 JLRRouteDefinition惭等,遍歷時每個 JLRRouteDefinition 會根據(jù) request 進行匹配并生成一個 JLRRouteResponse
對象,如果匹配上了办铡,就回調(diào) block辞做,并回傳參數(shù)。
[圖片上傳失敗...(image-93150f-1517495654112)]
圖 2. 解析 URL 流程
3. 主要的類
類名 | 作用 |
---|---|
JLRoutes | 作為 JLRoutes 框架的入口寡具,負責(zé)注冊 URL秤茅,管理路由以及分配路由。 |
JLRRouteDefinition | 用來封裝注冊 URL 的路由信息童叠,包括 URL scheme, route pattern, and priority框喳,并且可以根據(jù) request 提供相應(yīng)的 response。可以通過繼承該類來實現(xiàn)自定義的匹配方式五垮。 |
JLRRouteRequest | 用來封裝一個 URL 的路由請求信息乍惊,包括 URL、解析后的 path components 和 query parameters放仗。 |
JLRRouteResponse | 根據(jù) URL 匹配路由信息時的 response润绎,包含 isMatch、parameters 等信息匙监。如果 JLRRouteDefinition 匹配 URL 成功時凡橱,就會設(shè)置屬性 isMatch 為 YES,同時將解析 URL 后的參數(shù)和 默認參數(shù)亭姥、附加參數(shù)組合返回稼钩。 |
JLRRouteHandler 和 JLRRouteHandlerTarget | 自定義路由 handler,也就是將回調(diào)參數(shù)處理的邏輯交給自定義類去處理达罗。(ps:暫時還沒有想到這樣的好處是什么坝撑,給作者提了 issue) |
JLRParsingUtilities | 解析 URL 參數(shù)的工具類。 |
三粮揉、JLRoutes 的優(yōu)缺點
1. 優(yōu)點:
- 能匹配多種不同規(guī)則的 URL巡李,可以定義自定義的匹配規(guī)則、匹配邏輯
- 可以指定每個路由的優(yōu)先級
2. 缺點:
- 當(dāng)注冊的 URL 比較多時扶认,匹配效率比較低侨拦。
四、 技術(shù)點
- 設(shè)計框架時附帶了 log 功能辐宾,方便追蹤調(diào)試
- NSURLComponent狱从,NSScanner
- URL ,Request叠纹,Response季研,Definition 的路由模型、模塊化設(shè)計
- 容錯機制(fallback誉察、unmatchedURLHandler)
五与涡、問題
一個 APP 中的頁面有很多,當(dāng)越來越多的時候持偏,需要注冊的 URL 也就越多驼卖,這樣的話,注冊 URL 的文件不是會變得越來越大嗎鸿秆?
為什么要在 APP 啟動時注冊款慨?
參考:
如果你也喜歡交流技術(shù)檩奠、喜歡閱讀桩了、積極踐行,歡迎關(guān)注我的公眾號:祥龍Shannon寫字的地方埠戳,一起成長井誉。