JLRoutes 實現原理分析

一、簡介

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)

五、問題

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

  2. 為什么要在 APP 啟動時注冊?

參考:


如果你也喜歡交流技術、喜歡閱讀、積極踐行,歡迎關注我的公眾號:祥龍Shannon寫字的地方,一起成長。

qrcode_for_gh_cc686217be41_344.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,776評論 18 139
  • 前言 隨著用戶的需求越來越多,對App的用戶體驗也變的要求越來越高。為了更好的應對各種需求,開發人員從軟件工程的角...
    一縷殤流化隱半邊冰霜閱讀 87,347評論 214 1,098
  • 原文鏈接:https://github.com/halfrost/Halfrost-Field/blob/mast...
    hament閱讀 5,692評論 1 31
  • 背景說明 通知相關的頁面跳轉POCT項目處于后臺狀態,服務器發推信息到客戶端,客戶端在通知欄點擊消息,進入App并...
    sycasl閱讀 1,315評論 0 1
  • 介紹 : JLRoutes是一個調用極少代碼 , 可以很方便的處理不同URL schemes以及解析它們的參數,并...
    CoderLF閱讀 1,643評論 0 3