Swift组件化

2019-06-16

iOS组件化方案

将程序中功能相对独立的部分打包在一起形成模块,并且减少模块之间的直接依赖。

为什么要组件化

随着业务复杂度不断增加,工程越来越庞大,开发人员逐渐增多,单一工程的开发模式会出现一系列问题:

  • 耦合严重:组件之间依赖过于复杂,维护成本高。
  • 容易出现冲突:xib 或者代码冲突机会大大增加。
  • 开发效率低:每次都需要编译整个项目。

组件间通信方案

目前业界主要的方案有以下几种
  • Protocol注册方案
  • URL注册方案
  • Target-Action runtime调用方案
本博客采用Target-Action的方式

原理:

每个组件, 提供一个统一暴露的接口文件 额外的维护一个中间件的分类扩展(用Runtime进行解耦) 其他地方通过target-action的方案进行交互

特点:

统一了组件api服务 组件与框架之间无依赖关系 需要额外维护中间件类扩展

创建组件

查看本地Repo

pod repo list

添加本地远程索引库

pod repo add specs http:xxx

步骤一: 创建podspec

创建Pod, 会生成podspec文件

pod lib create project

步骤二: 本地验证

验证本地spec是否存在错误

pod lib lint

如果本地spec中对依赖了私有库

pod lib lint --sources='private spec url, https://github.com/CocoaPods/Specs.git' --allow-warnings

步骤三: 提交到远程

本地验证成功后,需提交到远程服务器,并打Tag,确保和spec中保持一致

git push origin master
git tag 1.0
git push --tags #上传本地所有tag
步骤四: 远程验证

pod spec lint --allow-warnings --verbose

步骤五: 组件库发布

pod repo push RepoName xx.podspec

步骤六: 检查组件库

~/.cocoapods目录下查看与Spec同名的文件夹,即为本地索引库

使用组件

在podfile中添加pod的源路径

source 'https://github.com/CocoaPods/Specs.git' 
source 'xxx/xxx/xxxxx.git' # 私有库 repo

podspec文件

s.source_files的写法

  • “*” 表示匹配所有文件
  • “*.{h,m,swift}” 表示匹配所有以.h和.m结尾的文件
  • “**” 表示匹配所有子目录
  s.dependency 'IQKeyboardManagerSwift', '6.3.0'
  s.dependency 'Kingfisher',  '4.10.1'  

在spec中添加资源文件(图片,国际化字符串)

  • resource_bundles
  • resources

官方建议使用resource_bundles,这样可以避免主工程和组件中的资源出现冲突