一、簡介
1. 使用場景
- deep link:通過 Custom URL Scheme 由外部跳轉到 app,比如推送跳轉,app 間跳轉。
- app 內部路由跳轉:使用中介者模式對 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.注冊流程
調用 addRoute:handler:
方法注冊 url scheme,保存/取出每個 scheme 對應的 routes controller 對象(以 key-value 形式保存的);注冊 url pattern,按優先級將每個 pattern 對應的 JLRRouteDefinition(封裝 pattern、priority、回調 block 等數據)通過插入排序的方式保存到數組中,這里一個 pattern 可能對應一個或者多個 JLRRouteDefinition。
[圖片上傳失敗...(image-121211-1517495654112)]
圖 1. 注冊 URL 流程
2. 解析 URL 流程
調用 routeURL:
方法喚起 URL時,取出 scheme 對應的 routes controller,生成 JLRRouteRequest,然后遍歷所有注冊過的 JLRRouteDefinition,遍歷時每個 JLRRouteDefinition 會根據 request 進行匹配并生成一個 JLRRouteResponse
對象,如果匹配上了,就回調 block,并回傳參數。
[圖片上傳失敗...(image-93150f-1517495654112)]
圖 2. 解析 URL 流程
3. 主要的類
類名 | 作用 |
---|---|
JLRoutes | 作為 JLRoutes 框架的入口,負責注冊 URL,管理路由以及分配路由。 |
JLRRouteDefinition | 用來封裝注冊 URL 的路由信息,包括 URL scheme, route pattern, and priority,并且可以根據 request 提供相應的 response。可以通過繼承該類來實現自定義的匹配方式。 |
JLRRouteRequest | 用來封裝一個 URL 的路由請求信息,包括 URL、解析后的 path components 和 query parameters。 |
JLRRouteResponse | 根據 URL 匹配路由信息時的 response,包含 isMatch、parameters 等信息。如果 JLRRouteDefinition 匹配 URL 成功時,就會設置屬性 isMatch 為 YES,同時將解析 URL 后的參數和 默認參數、附加參數組合返回。 |
JLRRouteHandler 和 JLRRouteHandlerTarget | 自定義路由 handler,也就是將回調參數處理的邏輯交給自定義類去處理。(ps:暫時還沒有想到這樣的好處是什么,給作者提了 issue) |
JLRParsingUtilities | 解析 URL 參數的工具類。 |
三、JLRoutes 的優缺點
1. 優點:
- 能匹配多種不同規則的 URL,可以定義自定義的匹配規則、匹配邏輯
- 可以指定每個路由的優先級
2. 缺點:
- 當注冊的 URL 比較多時,匹配效率比較低。
四、 技術點
- 設計框架時附帶了 log 功能,方便追蹤調試
- NSURLComponent,NSScanner
- URL ,Request,Response,Definition 的路由模型、模塊化設計
- 容錯機制(fallback、unmatchedURLHandler)
五、問題
一個 APP 中的頁面有很多,當越來越多的時候,需要注冊的 URL 也就越多,這樣的話,注冊 URL 的文件不是會變得越來越大嗎?
為什么要在 APP 啟動時注冊?
參考:
如果你也喜歡交流技術、喜歡閱讀、積極踐行,歡迎關注我的公眾號:祥龍Shannon寫字的地方,一起成長。
qrcode_for_gh_cc686217be41_344.jpg