iOS router 设计

iOS页面之间的跳转常用基于URL的router和mediator,过去有蘑菇街的方案 ([limboy.me/tech/2016/0…]) 和Casa Taloyum的方案 ([casatwy.com/iOS-Moduliz…]) 的激烈讨论,业界的各种方案其实也是这两种方案的变种,包括豆瓣的解决方案 ([github.com/douban/FRDI…]) 是基于URL注册的扩展,吸纳了Android的设计,解决了URL字符串不能传递对象的缺点。
我认为一个好的页面跳转方案必须考虑到以下功能:

页面的解耦

不同页面之间直接持有viewcontroller对象然后进行push显然是不好的实践,A页面的改动会影响到持有它的B页面的代码,所以通过一个中间者进行解耦是自然而然的设计。这个中间者可以是一个mediator也可以是一个协议名称。
把页面的class名字作为协议名称是bad case的设计,有时候会看到这样的设计:

+ (UIViewController *)getControllerWithName:(NSString *)vcClassString action:(NSString *)actionName passObject:(id)object {
             // return viewController;
  }复制代码

之所以不是好的设计,是因为A页面都感知B页面的类名了,就破坏了解耦的意图,如果B页面想重命名,还需要通知各个引用到B页面名字的人一一改名字。

传递参数

A页面打开B页面,A页面经常需要向B页面传递参数,B页面也有可能向A页面回传参数。参数必须支持原始数据类型、字符串还有不方便序列化的对象(如UIImage)。

远程跳转

支持远程跳转到指定的页面是router必不可少的功能。所以router要有把url解析成相应页面的能力。对于hybrid架构的H5页面,router也要提供根据url跳转到H5页面的功能。

安全性

对于支付等涉及到安全性的页面,不应该开放远程跳转的能力。所以router要区分出远程调转和本地跳转,而且对于远程跳转的页面要限制跳转的目标页面范围。

多级页面跳转

提供跳转到栈底的某个页面的功能,因为交互和产品的需求,很多页面并不是直接pop出堆栈,而是用户点击后要跳转到栈底的某个特定页面,所以这时候就要求router不能仅仅提供pop的功能,而是需要利用中间者进行跳转,而跳转方案同样要符合解耦的要求,不能直接引用class或者classname。


过去的一年多经历了几个App,总结下实践下来觉得work得还不错的方案。

基于配置文件的页面scheme

这是配置的页面的scheme,scheme字段用于标识一个页面,在内部跳转到远程跳转都需要用到,统一了内部和外部的跳转。needLogin表示这个页面在push的时候需要验证登录,如果没有登录的话就自动唤起登录页面。allowRemote标识了这个页面允许远程跳转。
对于外部跳转,接口设计如下,url只需要传入定义好协议的字符串即可。

 [DRCRouter openURL:url];复制代码

对于内部跳转,接口设计如下,params传入dictionary,支持非序列化的对象。

 [DRCRouter pushWithSchema:@"orderDetail" params:@{@"orderId":orderId}];复制代码

其实外部跳转只是内部跳转的一个子集,对于通过openURL打开native页面的情况,最终也是经过解析调用pushWithSchema方法。

结合scheme的页面回退

对于需要回退到栈底的某个页面的时候,调用接口:

 [DRCRouter popToSchema:@"orderDetail"];复制代码

可以调转到栈底的任意页面,原理也是通过配置表去查找scheme对应的vc。

前置拦截

为了安全性的需求,有些页面只能允许内部跳转,外部跳转即使拼对了url也不允许跳转。所以router内部会根据来源来判断是否能跳转到相应的页面。并且,对于需要登录才能进入的页面,会先弹出登录框用户登录后再进入页面。


未完待续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值