Swift路由组件(一)使用路由的目的和实现思想
Swift路由组件(一)使用路由的目的和实现思想
这个为本人原创,转载请注明出处:juejin.cn/post/703216…
目的
项目开发到一定程度,功能之间的调用会变的越来越复杂
这里用一个商品购买的逻辑举例
从图上看,问题就是业务之间的跳转很多,而且乱。还有就是当跳同一个页面时,跳转要带的参数都一致,如何保证?如果代码分散到各个业务里面去跳就难免会到处维护的问题。
这就需要路由了。
而且路由做好了,还能有一个好处就是后端或者前端,他们按路由协议统一处理跳转,app就可以不考虑业务之间的跳转了。
下面是加上路由模块的跳转图。
这下清晰了。
从图上来看,路由,他主要负责业务的跳转,从一个页面跳转到另一个页面等。
实现的思想
为了能跳,那么就需要知道路。所以可以这样理解,路由他需要知道你要跳转到哪里去,去的地方需要什么入参。
所以得有一个key,map到一个ViewController,然后ViewController需要什么入参,就顺便带过来。
解决这个key的问题,业界比较常见的做法是有一个路由表
- 比如维护一个plist文件,开发的时候把对应的key映射controller维护到plist里面,运行的时候一次性load到内存中。然后路由要跳转的时候就只需要查表来跳。
- 或者在运行的时候通过业务注册,每个业务把key注册到路由里面去,在内存中维护一个路由表。
两种方法都可以。结果大概是这样。
key | value |
---|---|
to_home_page | HomeViewController |
to_buy_page | BuyViewController |
... | ... |
路由跳转他要解决三种跳转逻辑
- 通过后端下发,直接让App打开某个原生或者Web页面
- 比如推送消息,点击消息就可以进入某个原生或者Web页面
- 比如后端返回的商品卡片,点击商品进入某个原生或者Web页面
- 比如活动页面,点击按钮进入某个原生或者Web页面
- 比如原生页面的某个按钮,点击按钮进入某个原生或者Web页面
总结起来也就两种,
- 一种是远程调用,
- 一种是app内部调用。
所谓远程调用就是app提供的跳转能力,允许外面调用的。再者理解,可以被别的app打开调用,比如微信的分享,支付等。相对的内部调用就是app内部由A页面跳转到B页面的。
所以针对上面的用处,从命名上可以做好区分,比如内部调用加native://做为开头,表示是内部调用。外部就加weixinapp://(用app名更容易调用者理解),或者加http/https,毕竟可以直接兼容http://www.baidu.com 这样的网页
之所以要好明确区分,是因为可以利用路由做好统一的权限管理。比如外部调用可以加某一种校验后直接打开,内部调用就加另一种检验,特别是内部跳转要做好权限控制,确保真的是你自己的app调用的内部调用才能打开,防止别人只是用URL Schemes就打开了你的内部页面。
想到这,那是不是可以加多种前缀呢,答案肯定是可以的,具体看不同公司的业务。这里就先加两种先。 如下:
key | value |
---|---|
native://to_home_page | HomeViewController |
native://to_buy_page | BuyViewController |
http | WebViewController |
https | WebViewController |
... | ... |
上面是说,
- 当key是native://to_home_page的时候,就进入主页,打开HomeViewController这个页面。
- 当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路由组件(二)路由的实现
链接:https://juejin.cn/post/7032164814210203685/