iOS-组件化(CocoaPods)

随着移动互联网的不断发展,很多程序代码量和业务越来越多,现有架构已经不适合公司业务的发展速度了,很多都面临着重构的问题。
在公司项目开发中,如果项目比较小,普通的单工程+MVC架构就可以满足大多数需求了。但是像淘宝、蘑菇街、微信这样的大型项目,原有的单工程架构就不足以满足架构需求了。

组件化简介

将一个工程分解为各个组件,然后按照某种方式任意组织成为一一个拥有完整业务逻辑的工程。

优点

  1. 组件的独立性
  2. 资源重用
  3. 高效迭代
  4. 配合我们二进制,加快项目的编译速度

缺点

  1. 增加开发人员的学习成本
  2. 增加了代码的冗余,组件化颗粒度越细,中间代码越多
  3. 增加了项目的复杂度,复杂度越高越容易出问题

组建划分

  1. 基础组件
    基础配置(宏,常量),分类, 网络(AFNetworking, SDWebImage二次封装)、工具类(日期时间的处理,文件处理,设备处理)

  2. 功能组件
    控件(弹幕,轮播器,选项卡);功能(断点续传,音频处理)

  3. 业务组件
    业务线一,业务线二。

CocoaPods

多人协作的项目工程中,独立的代码模块划分的重要性是毋庸置疑的。而CocoaPods是一个iOS的包管理第三方工具(类似的概念),它可以方便的帮助我们管理代码模块。

安装

一般情况下,下面这条命令就能安装最新的cocoapods到本地。

1
sudo gem install cocoapods

然而有时候也会由于以下几个问题导致安装失败:

  • gem版本太旧
  • gem源访问不到
  • ruby环境问题

具体问题还得再去发动Google大法找一找如何解决。

更新gem版本和替换gem源

1
2
gem update --system # 这里请翻墙一下
gem -v
1
2
3
4
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem sources -l
https://gems.ruby-china.com
# 确保只有 gems.ruby-china.com

更换Ruby环境

由于MacOS系统自带了一个Ruby环境,但是usr/bin的访问权限可能会导致一些问题,最好还是使用Homebrew安装一个ruby。

使用brew install ruby装好Ruby后记得给Shell配一下环境变量如下:

1
export PATH="/usr/local/lib/ruby/gems/2.5.0/bin:/usr/local/opt/ruby/bin:/usr/local/bin:$PATH"

本地pod库

pod的原理

CocoaPods的工作主要是通过ProjectName.xcworkspace来组织的,在打开ProjectName.xcworkspace文件后,发现Xcode会多出一个Pods工程。

  1. 库文件引入及配置:
    库文件的引入主要由Pods工程中的Pods-ProjectName-frameworks.sh脚本负责,在每次编译的时候,该脚本会帮你把预引入的所有三方库文件打包的成ProjectName.a静态库文件,放在我们原Xcode工程中Framework文件夹下,供工程使用。
    如果Podfile使用了use_frameworks!,这是生成的是.framework的动态库文件。引入方式也略有不同。
  2. Resource文件:
    Resource资源文件主要由Pods工程中的Pods-ProjectName-resources.sh脚本负责,在每次编译的时候,该脚本会帮你将所有三方库的Resource文件copy到目标目录中。
  3. 依赖参数设置:
    在Pods工程中的的每个库文件都有一个相应的SDKName.xcconfig,在编译时,CocoaPods就是通过这些文件来设置所有的依赖参数的,编译后,在主工程的Pods文件夹下会生成两个配置文件,Pods-ProjectName.debug.xcconfig、Pods-ProjectName.release.xcconfig。

创建本地pod库

1.创建一个本地Demo工程

1
pod lib create RCDownloader

2.填入询问的问题,填完之后会自动打开一个Demo工程

1
2
3
4
5
6
7
8
9
10
11
12
What platform do you want to use?? [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> Objc
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> No
What is your class prefix?
> RC

3.找到Pod工程下面有一个Development Pods文件夹下面的工程名下面的ReplaceMe.m文件

4.右键ReplaceMe.m文件,Show in Finder到Finder文件夹,把我们封装的.h和.m文件替换掉ReplaceMe.m

5.将替换进来的文件,拖拽到工程刚刚ReplaceMe.m所在的文件夹,然后全选Target

6.主工程下面有一个Example for <classname>文件夹,这个文件夹是用来调试的类库

7.在我们需要引入该Pod库的工程的Podfile文件中加入pod 'RCDownloader', :path => '可以是绝对路径/相对路径'

8.执行pod install

注意:
如果我们的Pod有需要依赖的Framework,那么就打开组建工程的spec文件,里面有配置framework的地方。

远程pod库

创建远程索引库

1.打开码云(他家私有库不要钱,github私有库要钱)

2.创建一个项目:名称是RCSpecs,私有的Objc

3.添加本地索引库

1
pod repo add RCSpecs https://gitee.com/****/RCSpecs.git

4.查看本地索引库列表

1
pod repo

5.将本地Pod库关联本地索引库
1.在码云上再创建一个项目名称是RCDownloader私有的
2.终端切换到RCDownloader工程根目录
3.提交代码

1
2
3
4
git add .
git commit -m "初始化工程"
git remote add origin https://gitee.com/****/RCDownloader.git
git push origin master -f

4.修改本地spec文件

1
2
s.homepage         = 'https://gitee.com/htyh_manito_rencheng11/RCDownloader'
s.source = { :git => 'https://gitee.com/******/RCDownloader.git', :tag => s.version.to_s }

5.打 tag 0.1.0(跟s.version保持一致)

1
2
git tag 0.1.0
git push --tags

6.将修改的spec文件上传到远程仓库

add .
1
2
git commit -m "修改spec"
git push origin master

7.验证spec文件(警告可以忽略)

1
pod spec lint

8.上传RCDownloader.spec到远程索引库

1
pod repo push RCSpecs RCDownloader.podspec --allow-warnings

9.Podfile文件中增加source

1
2
source 'https://gitee.com/htyh_manito_rencheng11/RCSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'

10.pod install引入

1
2
3
# 这么写可以每次获取最新版本
pod RCDownloader, :git=>'http://*****/RCDownloader.git'
pod install

清除Pod缓存

  1. 移除项目目录 Pods 文件下的 xxx
  2. 删除 CocoaPods 目录缓存, 找到 ~/Library/Caches/CocoaPods/Pods/Release, 删除此目录。
  3. 点击Xcode -> Preferences -> Locations -> Derived Data 点击下方的右箭头跳转到相应目, 删除此目录即可。
  4. 项目根目录执行pod repo update
  5. 项目根目录执行pod install