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阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容