JLRoutes 實現原理分析

ShannonChenCHN發表於2018-02-01

一、簡介

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 實現原理分析

圖 1. 註冊 URL 流程

2. 解析 URL 流程

呼叫 routeURL: 方法喚起 URL時,取出 scheme 對應的 routes controller,生成 JLRRouteRequest,然後遍歷所有註冊過的 JLRRouteDefinition,遍歷時每個 JLRRouteDefinition 會根據 request 進行匹配並生成一個 JLRRouteResponse 物件,如果匹配上了,就回撥 block,並回傳引數。

JLRoutes 實現原理分析

圖 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)

五、問題

  1. 一個 APP 中的頁面有很多,當越來越多的時候,需要註冊的 URL 也就越多,這樣的話,註冊 URL 的檔案不是會變得越來越大嗎?

  2. 為什麼要在 APP 啟動時註冊?

參考:

相關文章