Swift路由组件(一)使用路由的目的和实现思想

2,460 阅读4分钟

这个为本人原创,转载请注明出处:juejin.cn/post/703216…

目的

项目开发到一定程度,功能之间的调用会变的越来越复杂

这里用一个商品购买的逻辑举例

image.png

从图上看,问题就是业务之间的跳转很多,而且乱。还有就是当跳同一个页面时,跳转要带的参数都一致,如何保证?如果代码分散到各个业务里面去跳就难免会到处维护的问题。

这就需要路由了。

而且路由做好了,还能有一个好处就是后端或者前端,他们按路由协议统一处理跳转,app就可以不考虑业务之间的跳转了。

下面是加上路由模块的跳转图。

image.png

这下清晰了。

从图上来看,路由,他主要负责业务的跳转,从一个页面跳转到另一个页面等。

实现的思想

为了能跳,那么就需要知道路。所以可以这样理解,路由他需要知道你要跳转到哪里去,去的地方需要什么入参。

所以得有一个key,map到一个ViewController,然后ViewController需要什么入参,就顺便带过来。

解决这个key的问题,业界比较常见的做法是有一个路由表

  1. 比如维护一个plist文件,开发的时候把对应的key映射controller维护到plist里面,运行的时候一次性load到内存中。然后路由要跳转的时候就只需要查表来跳。
  2. 或者在运行的时候通过业务注册,每个业务把key注册到路由里面去,在内存中维护一个路由表。

两种方法都可以。结果大概是这样。

keyvalue
to_home_pageHomeViewController
to_buy_pageBuyViewController
......

路由跳转他要解决三种跳转逻辑

  1. 通过后端下发,直接让App打开某个原生或者Web页面
    • 比如推送消息,点击消息就可以进入某个原生或者Web页面
    • 比如后端返回的商品卡片,点击商品进入某个原生或者Web页面
  2. 比如活动页面,点击按钮进入某个原生或者Web页面
  3. 比如原生页面的某个按钮,点击按钮进入某个原生或者Web页面

总结起来也就两种,

  1. 一种是远程调用,
  2. 一种是app内部调用。

所谓远程调用就是app提供的跳转能力,允许外面调用的。再者理解,可以被别的app打开调用,比如微信的分享,支付等。相对的内部调用就是app内部由A页面跳转到B页面的。

所以针对上面的用处,从命名上可以做好区分,比如内部调用加native://做为开头,表示是内部调用。外部就加weixinapp://(用app名更容易调用者理解),或者加http/https,毕竟可以直接兼容www.baidu.com 这样的网页

之所以要好明确区分,是因为可以利用路由做好统一的权限管理。比如外部调用可以加某一种校验后直接打开,内部调用就加另一种检验,特别是内部跳转要做好权限控制,确保真的是你自己的app调用的内部调用才能打开,防止别人只是用URL Schemes就打开了你的内部页面。

想到这,那是不是可以加多种前缀呢,答案肯定是可以的,具体看不同公司的业务。这里就先加两种先。 如下:

keyvalue
native://to_home_pageHomeViewController
native://to_buy_pageBuyViewController
httpWebViewController
httpsWebViewController
......

上面是说,

  1. 当key是native://to_home_page的时候,就进入主页,打开HomeViewController这个页面。
  2. 当key是http的时候。就进入网页,打开WebViewController这个页面渲染。

看到这,那么路由的定义也就出来了。 统一的入口和传参,如:

YYRouter.push(jumpParams: [:])

然后调用上面的路由表如下:

YYRouter.push(jumpParams: ["to":"native://to_home_page"]) // 去到首页
YYRouter.push(jumpParams: ["to":"http://www.baidu.com"]) // 打开网页
YYRouter.push(jumpParams: ["to":"https://www.baidu.com"]) // 打开网页

想传参数,那就这样。

YYRouter.push(jumpParams: ["to":"native://to_home_page", "name": "名字"])
YYRouter.push(jumpParams: ["to":"http://www.baidu.com&a=1&b=2", "name": "名字"])
YYRouter.push(jumpParams: ["to":"https://www.baidu.com&c=3&d=4", "name": "名字"])

终上一个路由的定义就出来了。

下一编,再讲一个路由的具体实现。 Swift路由组件(二)路由的实现