一、簡介
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。
![JLRoutes 實現原理分析](https://i.iter01.com/images/4ef76ef060bbe04037ef2214c5e805ee979091f93c4f64e3ad38c1b4f37000c5.png)
圖 1. 註冊 URL 流程
2. 解析 URL 流程
呼叫 routeURL:
方法喚起 URL時,取出 scheme 對應的 routes controller,生成 JLRRouteRequest,然後遍歷所有註冊過的 JLRRouteDefinition,遍歷時每個 JLRRouteDefinition 會根據 request 進行匹配並生成一個 JLRRouteResponse
物件,如果匹配上了,就回撥 block,並回傳引數。
![JLRoutes 實現原理分析](https://i.iter01.com/images/e16a6c32d182f3864123654b8b6ff8350bbfd28e1836c7413e8e16ff8bff1f29.png)
圖 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 啟動時註冊?