CocoaPods使用技巧

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

CocoaPod官方地址

安装CocoaPods

一般情况下,我们直接使用👇这条命令就能安装最新的cocoapods到本地。

1
sudo gem install cocoapods

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

  • gem版本太旧
  • gem源访问不到
  • ruby环境问题
    具体问题还得再去发动Google大法找一找如何解决。

更新gem版本和替换gem源

由于国内的网络环境问题,我们有时候可能需要替换以下gem的源为Ruby-China

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环境

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

使用brew install ruby装好Ruby后记得给Shell配一下环境变量如下:
export PATH="/usr/local/lib/ruby/gems/2.5.0/bin:/usr/local/opt/ruby/bin:/usr/local/bin:$PATH"

使用Podfile引入独立代码模块

Podfile是一种工程代码库配置文件,可以用它来安装独立的Cocoapods代码库。
首先,我们进入到我们的iOS工程目录下(**.xcodeproj这个文件的同级目录)。然后运行一下pod init生成一个Podfile文件。

这就是一个生成的一个标准模板

默认源的简单Podfile

1
2
3
4
5
6
7
8
9
10
11
12
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'UnityAdsDemo' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for UnityAdsDemo
pod 'AFNetworking', '~> 2.6'
pod 'ORStackView', '~> 3.0'
pod 'SwiftyJSON', '~> 2.3'
end

这个Podfile默认从Cocoapods的仓库拉取代码。

带独立源的指定分支Podfile

1
2
3
4
5
6
7
8
9
source 'https://github.com/CocoaPods/Specs.git'
source 'http://你的Cocoapods仓库地址(存着各个模块代码的podspec)/specs.git'

platform :ios, '8.0'
target 'UnityAdsDemo' do

pod 'UnityAds', :path => '../UnityAds.podspec'
pod 'AFNetworking', :git => 'git@github.com:AFNetworking/AFNetworking.git', :branch => 'master'
end

这个Podfile使得我们可以从我们自己的私有仓库拉取代码。

使用宏定义带独立源的指定分支可动态配置的Podfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
source 'https://github.com/CocoaPods/Specs.git'
source 'http://你的Cocoapods仓库地址(存着各个模块代码的podspec)/specs.git'

def debug_tool
pod 'DebugTool', :configurations => 'Debug' # 只在 Debug 时引入
end

platform :ios, '8.0'

target 'UnityAdsDemo' do
debug_tool

pod 'UnityAds', :path => '../UnityAds.podspec'
pod 'AFNetworking', :git => 'git@github.com:AFNetworking/AFNetworking.git', :branch => 'master'
pod 'Demo'

post_install do |installer_representation|
# 根据是否有引入一个模块来标记一个变量
isDebugToolDef = "DEBUGTOOL=0"
installer_representation.pods_project.targets.each do |target|
if target.name == 'DebugTool'
isDebugToolDef = "DEBUGTOOL=1"
end
end

# 根据这个变量来配置另外一个模块的依赖
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if target.name == 'Demo'
puts "Demo #{isDebugToolDef}"
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = ['$(inherited)', "#{isDebugToolDef}"]
end
end
end
end
end

这个是动态配置模块依赖的Podfile示例,具体需要根据项目需求编写。

使用Podspec管理独立代码模块

上面介绍如何引入Pod库,接下来介绍一下如何创建一个Pod库,大概就以下三个步骤:

1
2
3
$ pod spec create Peanut        #创建一个podspec
$ edit Peanut.podspec #编辑podspec
$ pod spec lint Peanut.podspec #验证podspec是否有效

Podspec的语法也很简单,具体写法可以参考Podspec具体介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Pod::Spec.new do |spec|
spec.name = 'Reachability'
spec.version = '3.1.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://github.com/tonymillion/Reachability'
spec.authors = { 'Tony Million' => 'tonymillion@gmail.com' }
spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
spec.source = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
spec.module_name = 'Rich'
spec.swift_version = '4.0'

spec.ios.deployment_target = '9.0'
spec.osx.deployment_target = '10.10'

spec.source_files = 'Reachability/common/*.swift'
spec.ios.source_files = 'Reachability/ios/*.swift', 'Reachability/extensions/*.swift'
spec.osx.source_files = 'Reachability/osx/*.swift'

spec.framework = 'SystemConfiguration'
spec.ios.framework = 'UIKit'
spec.osx.framework = 'AppKit'

spec.dependency 'SomeOtherPod'
end

cocoapods-packager打包插件

这是一个Cocoapods插件,它可以将一个Pod工程打包成framework或者静态库。

1
pod package Demo.podspec --spec-sources=git@xxx:Demo/specs.git,https://github.com/CocoaPods/Specs.git --dynamic --verbose

cocoapods-packager地址