iOS路由调度中心设计

628 阅读3分钟

1.背景----为什么做

项目需求多变,传统的架构,在不断的增加需求和修改需求的过程中,模块越来越重,耦合性太强,不好分离。依赖多,复用低,管理起来复杂,而且无法实现动态效果。

  • 因为iOS原生这面其实是没有路由的概念的,都是在项目发展的困境和挑战下,自己去实现出一套适合自己的映射系统。在基本思想下,不同公司的路由都会存在一些差异。
  • iOS端常用的路由实现有三种,target-action充分利用runtime特性,无需注册,编写大量类拓展;protocol-class就是协议嘛,处处遵守协议;URLRoute最大的优点是服务器可以控制页面的跳转。

2.目标----做成什么

  • 独立性:实现页面与页面的访问,模块与模块的访问,方法与方法的传递皆路由。无需知道彼此的实现。
  • 统一性:统一调用方式。支持建立调用协议和数据协议,发起方可以有目标的响应回调,并且实现双向调用。支持handlerBlock形式,调用方实现目标控制器的handlerBlock实现。
  • 可复用性:灵活可配置路由规则与路由表。不依赖于任何app, 做到跨app可复用。

3.实现----怎么做

3.1 设计规划

  • plist:以配置文件的形式代替代码注册,这里有两个文件,methodList代表方法路由,pageList代表页面路由。
  • RouteProtocol:这个类主要用来实现参数值传递和事件传递,里面包含四个协议方法。通过运行时匹配到的类发送调用路由协议,遵循了路由协议的类实现这个协议方法,实现事件和参数值的传递。
  • RouteConfig:是路由配置信息类,里面包含加载路由文件的方法,解析重组进内存的路由字典,还有路由规则,路由规则是由routeSchemeKeyrouteDomainKey和路由标示组成。动态可配置保证安全性。
  • Category:路由分类拓展由系统页面拓展和object拓展组成。UIViewController的分类用于对外直接提供的路由属性和handlerBlock代码块;NSObject的分类用于对系统堆栈操作相关方法进行重写,内部增加边界检测容错,保证安全性和获取currentVC等。
  • RouterCenter:外部对于调度中心的核心功能使用都是通过RouterCenter来完成的,startRouter方法会传入表示与参数,内部通过运行时特性去匹配到对应的类,并判断目标类是否可以响应路由协议,接收事件参数。

3.2 基于此路由中心的整体电商项目框架

  • 对于电商app,活动推广,外部访问页面灵活的灵活性是很有必要的,URLRoute特性。内部使用又不想要写注册代码,可以用运行时特性去匹配类名和事件传递,targetaction特性。
  • 支持服务器下发路由规则/路由表和内部设置默认值做容错处理,app的适配层对routeConfig进行加载,对外部链接访问app进行加载路由处理。methodRoute和pageRoute对应模块和页面的路由,后面跟标示和参数。
  • 通过包含pageRoute的标识链接打开app的同时可以访问基本所有的页面,通过包含methodRoute的标示链接打开app的同时可以访问到类方法,即直接调起功能。
  • 业务模块这里是在基类里面引入路由,而且页面层继承基类实现楼层化固定模版,VM内loadData,然后configData,然后组装页面,所有页面都可认为是大楼的结构,单元灵活隐藏拆卸,configData会处理成大楼需要的数据格式。