组件化方案
需求背景
现状
公司内部多个app需要共用一些通用模块,比如im等,每个都写一套代码,代价比较大,因此需要做组件化设计。
目标
能支持多团队并行开发,每个组件都需要能单独开发,测试和发布
根据产品需求灵活的构建不同的产品出来
解决方案
方案概述
目前市面上主要有俩种方案,路由方案和runtime方案
路由方案存在注册以及代码分散问题
runtime casa方案存在category的硬编码,而且对于分类来说,如果多个组件存在同名方法的话被同时引入使用会出错,这种问题排查会比较困难
我们组件化方案主要是基于rumtime方案的修改,消除了category的硬编码,同时增加组件运行的生命周期,每个组件提供唯一的入口类,由组件入口类的goPage方法集中管理所有导航URL,通过getData/setData方法管理所有数据读写
组件架构图
通讯协议
页面跳转协议
协议名称:yic://组件名称/页面名称
如车主端打开IM
url: yic://com.yic.im/oneCarIM params为字典传参
对接方式:
[YICCommponentBase goPage:url params:params]; 页面跳转
[YICCommponentBase getPage:url params:params];页面获取 该方法得到当前页面的viewcontroller 未找到返回nil
数据获取
协议名称:yic://组件名称/方法名称
使用样例:url:yic://com.yic.im/getAppraise
id data= [YICCommponentBase getData:url params:params];同步根据返回值读取
[YICCommponentBase getData:url params:params completion:^(id _Nonnull responseObject) {}]; 异步获取消息
数据写入
协议名称:yic://组件名称/方法名称
使用样例:url:yic://com.yic.im/setFriend
[YICCommponentBase setData:url params:params];同步写入数据
[YICCommponentBase setData:url params:params completion:^(id _Nonnull responseObject) {}]; 异步写入消息
-
中间件代码实现
-
组件入口类代码
本方案的优势
- 增加组件运行的生命周期,可以在组件初始化时候添加启动代码
- 与casa相比消除了category的硬编码
- 由入口类统一管理url跳转和数据读写
- 支持黑盒服务,每个组件可以单独开发,测试和发布
附录
本文参考资料:https://www.cnblogs.com/dins/p/ios-zu-jian-hua-fang-an.html