iOS模块化开发的两种基本实现方式

前言

模块化开发有诸多的优势:

  • 避免耦合
  • 分工明细
  • 职责单一
  • 依赖清晰
  • 便于移植
  • 灵活组合

模块化开发试用场景:

  • 项目较大,功能复杂
  • 功能模块需要跨项目运行
  • 功能模块有高频度复用需求

iOS开发中模块化主流的有两种方案:

  • CocoaPods私有库
  • 一个XCode Workspace组合若干个Project
  • 综合前两中方案实现

使用CocoaPods私有库实现模块化

这里也可以参考我的另一篇文章,如何创建CocoaPods开源库,里面有CocoaPods创建自建仓库的详细说明。

接下来我们实战创建两个私有库来实现模块化开发。

创建工程命名为Proj1

得到一个工程,工程目录如下:

创建Cocoapods私有库

显然,这时候CocoaPods还没有参与管理项目,我们找到项目根目录。

我们要使用Cocoapods在这里创建一个新的库命名为MyUILib用做UI工具库,执行:

1
pod lib create MyUILib

在输入一系列的参数后,控制台输出如下:

编辑私有库的工程

接着XCode会自动打开一个新生成的工程。打开ReplaceMe.Swift所在目录.

可以看到MyUILib下包含了Classes和Assets两个目录
将Classes拖入工程ReplaceMe所在的位置。点击Finish完成目录导入。

删除Classes目录下的所有文件和ReplaceMe.swift

点击Move to Trash即删除到废纸篓。接着在Classes目录下创建
创建一个文件,命名为UIView+Extensions.swift

然后我们在UIView+Extensions.swift文件中写入代码:

1
2
3
4
5
6
7
8
import UIKit

extension UIView {
/// 设置背景色为红色
public func setRedBackgroundColor() {
self.backgroundColor = .red
}
}

接下来我们就可以去之前我们创建的Proj1中引入MyUILib模块(实际上是Cocoapods私有库)了。

关联工程与私有库模块

关闭MyUILib工程,使用终端打开Proj1工程目录。

1
cd /Users/xxx/.../Proj1/   

,然后执行:

1
pod init

Proj1变成了使用Cocoapods管理的工程。工程目录下多了一个Podfile文件,使用文本编辑器打开该文件,加入如下代码:

1
pod 'MyUILib', :path => './MyUILib/'

执行pod install

主工程Proj1成功依赖MyUILib库。如果要创建更多的模块,可以重复上述的步骤,实现更多的私有库模块。

我们来看看工程调用效果。打开Proj1.xcworkspace。在ViewController中调用MyUILib中的API,可以看到实际效果。

大功告成。

WorkSpace嵌套Project实现模块化

初始化主工程

创建一个工程命名为Proj2作为我们开发的主工程。

接着创建一个WorkSpace,同样命名为Proj2(也可以叫其他名字)。

创建WorkSpace并将主工程引入其中

将新创建的WorkSpace放在与Proj2.xcodeproj相同路径。

点击Save

接着XCode会自动打开该WorkSpace。我们在菜单中找到Add Files to "Proj2"

选择Proj2.xcodeproj,点击Add,即实现添加Project到WorkSpace。

创建一个工程作为依赖模块并引入到WorkSpace

然后我们再创建一个XCode工程。

我们创建一个用作UI库的模块,命名为UILib,这里创建类型选择Framework。

将该工程的保存路径放在与Proj2.xcodeproj相同路径。

点击Create之后,即生成了一个工程,关闭该工程窗口。

接着在之前打开的WorkSpace中将UILib工程添加进去。步骤之前已经有讲,这次选中UILib.xcodeproj工程。

点击Add后,WorkSpace中就包含UILib和Proj2两个工程了,其中Proj2这里作为主工程,UILib则是主工程依赖的模块。要注意的是模块之前的依赖管理一定要理清,尽量使用单向依赖,方便模块解耦,也符合设计模式的依赖倒置法则。

在模块中添加API并在主工程中调用

接下来我们在UILib中添加一个UIView+Extensions.swift文件,添加一段代码。

1
2
3
4
5
6
7
8
import UIKit

extension UIView {
/// 设置背景色为红色
public func setRedBackgroundColor() {
self.backgroundColor = .red
}
}

在Proj2的Build Phases -> Link Binary With Libraries中引入UILib.framework。

接下来在Proj1的ViewController中调用UILib中的方法,即实现了设置红色背景色的API。


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

iOS模块化开发的两种基本实现方式
https://cba023.github.io/posts/8f33a448/
作者
陈波
发布于
2022年3月2日
许可协议