一、模块化设计概念
模块化的核心目标是 解耦,将一个大型应用拆分为若干功能模块(Feature Module),如用户模块、支付模块、直播模块等,各模块可独立开发、编译、测试。
优势
- 降低耦合,提高复用性
- 提高团队并行开发效率
- 支持增量构建、热修复、动态下发
- 为组件化和插件化打下基础
二、iOS 模块化架构设计方案
1. 模块划分方式
按功能、业务域或技术层进行模块拆分:
- 功能模块:登录模块、支付模块、IM模块等
- 技术层模块:网络层(Network)、数据层(Storage)、工具库(Utils)
2. 模块组织结构(以 CocoaPods 为例)
1 2 3 4 5 6 7 8 9 10 11
| App/ ├── AppMain/ │ └── AppDelegate、路由注册入口等 ├── Modules/ │ ├── Login/ │ │ ├── LoginModule.podspec │ │ └── Source/ │ ├── Home/ │ │ └── HomeModule.podspec │ └── ... └── Pods/
|
3. 模块依赖管理工具
- CocoaPods(最常用,支持本地开发)
- Swift Package Manager(推荐新项目使用)
- Carthage(已不太流行)
三、路由机制设计
模块之间不能直接引用,如何在不耦合的前提下跳转页面或调用服务?这就需要路由机制。
常见路由框架
路由实现核心思想
- 注册:每个模块在初始化时向全局路由中心注册自己的路由路径和对应 handler。
- 路由表:以 path 为 key,保存 handler。
- 调用:其他模块通过 URL 或 identifier 发起路由调用,传参。
四、实践方案示例(MGJRouter)
1. 路由注册(Login 模块中)
1 2 3 4 5 6 7 8 9
| #import <MGJRouter/MGJRouter.h>
+ (void)load { [MGJRouter registerURLPattern:@"myapp://login" toHandler:^(NSDictionary *routerParameters) { UIViewController *vc = [[LoginViewController alloc] init]; UINavigationController *nav = routerParameters[MGJRouterParameterUserInfo][@"nav"]; [nav pushViewController:vc animated:YES]; }]; }
|
2. 发起路由调用(Home 模块)
1 2
| [MGJRouter openURL:@"myapp://login" withUserInfo:@{@"nav": self.navigationController}];
|
五、进阶实践:服务路由 + 解耦通信
1. 定义协议
1 2 3
| @protocol UserService <NSObject> - (BOOL)isLoggedIn; @end
|
2. 注册服务实现
1
| [Router registerService:@protocol(UserService) withImpl:[UserServiceImpl class]];
|
3. 获取服务调用
1 2
| id<UserService> service = [Router serviceForProtocol:@protocol(UserService)]; BOOL loggedIn = [service isLoggedIn];
|
六、推荐实践建议
- 路由机制与模块初始化解耦,可结合 AOP(例如
+load
或 RouterRegister
注册文件自动管理)
- URL路由适合页面跳转,协议路由适合服务调用
- 路由支持中间件拦截(如登录校验)
- 模块间只暴露接口,禁止直接引用源文件
七、参考项目结构建议
1 2 3 4 5 6 7 8 9 10 11
| Modules/ ├── Login/ │ └── LoginModule/ │ ├── Interface/ │ │ └── LoginService.h │ └── Impl/ │ └── LoginViewController.m ├── Router/ │ └── RouterCenter/ │ ├── MGJRouter 封装 │ └── 服务注册表
|