一、什么是CocoaPods
CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理。开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第三方开源库的时间。在使用CocoaPods之前,开发项目需要用到第三方开源库的时候,我们需要1.把开源库的源代码复制到项目中2.添加一些依赖框架和动态库3.设置-ObjC,-fno-objc-arc等参数4.管理他们的更新在使用CocoaPods后,我们只需要把用到的开源库放到一个名为Podfile的文件中,然后执行pod install.Cocoapods就会自动将这些第三方开源库的源码下载下来,并且为我们的工程设置好响应的系统依赖和编译参数。
二、CocoaPods的原理
CocoaPods的原理是将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可。
三、CocoaPods的安装与更新
CocoaPods可以通过Mac自带的RubyGems进行安装与更新。
打开Terminal,然后键入以下命令:$ sudo gem install -n /usr/local/bin cocoapods
执行完如果报以下错误:
ERROR: Could not find a valid gem 'cocoapods' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - Errno::ETIMEDOUT: Operation timed out - connect(2)
ERROR: Possible alternatives: cocoa pods
是因为ruby的软件源rubygems.org使用的亚马逊云服务,被我天朝屏蔽了,需要更新一下ruby的源,过程如下:
$ gem sources -l //查看当前ruby的源
$ gem sources --remove https://rubygems.org/
$ gem sources -a https://gems.ruby-china.org
$ gem sources -l
接下来用$ sudo gem update --system
命令升级gem。若报错
Operation not permitted - /usr/bin/update_rubygems
尝试命令$ brew install ruby
直到出现🍺 /usr/local/Cellar/ruby/2.2.3: 1080 files, 20M, built in 3.3 minutes
后
再次输入$ sudo gem update --system
升级gem,成功后提示:
RubyGems system software updated
然后重新执行命令 $ sudo gem install -n /usr/local/bin cocoapods
如果初次安装,还需执行:$ pod setup
把最新的类库信息拉取到本地spec文件。Terminal会停留在 Setting up CocoaPods master repo 这个状态一段时间,需要耐心等待。安装成功后,你会看到:
Setup completed
四、Cocoapods的使用
查看pod版本
$ pod --version
-
查找第三方库
$ pod search AFNetworking
按q即可退出。
如果搜索不到:
1、请先进行:$ pod setup
2、再清空一下搜索索引,让pod重建索引:
$ rm ~/Library/Caches/CocoaPods/search_index.json
这是因为之前pod search的时候生成了缓存文件search_index.json -
创建Podfile文件
cd到工程根目录下,输入$ vim Podfile
创建文件。按i进入插入模式,输入文本,按esc进入命令模式后,按:wq或ZZ退出并保存。
安装第三方库
$ pod install
1.成功后需要使用Cocoapods生成的 .xcworkspace文件来打开工程,而不是使用以前的.xcodeproj文件
2.执行之后,除了Podile,还会生成一个名为Podfile.lock的文件,它会锁定当前各依赖库的版本。之后即使多次执行$ pod install
也不会更改版本,只有执行pod update才会改变Podfile.lock。在多人协作的时候,这样可以防止第三方库升级时候造成大家各自的第三方库版本不一致。所以在提交版本的时候不能把它落下,也不要添加到.gitignore中
3.每次更改了Podfile文件,都需要重新执行一次$ pod update
命令卸载pod
1.$ which pod
查看pod所在路径 比如 /usr/local/bin/pod
2.$ rm -rf /usr/local/bin/pod
3.$ gem list | grep cocoapods
cocoapods (1.0.1)
cocoapods-core (1.0.1, 0.39.0, 0.38.2, 0.38.1, 0.37.2)
cocoapods-deintegrate (1.0.0)
cocoapods-downloader (1.1.0, 0.9.3, 0.9.1)
cocoapods-plugins (1.0.0, 0.4.2)
cocoapods-search (1.0.0, 0.1.0)
cocoapods-stats (1.0.0, 0.6.2, 0.5.3)
cocoapods-trunk (1.0.0, 0.6.4, 0.6.1)
cocoapods-try (1.1.0, 0.5.1, 0.4.5)
4.$ sudo gem uninstall xxx
$ sudo gem uninstall cocoapods
$ sudo gem uninstall cocoapods-core
$ sudo gem uninstall cocoapods-deintegrate
$ sudo gem uninstall cocoapods-downloader
$ sudo gem uninstall cocoapods-plugins
$ sudo gem uninstall cocoapods-search
$ sudo gem uninstall cocoapods-stats
$ sudo gem uninstall cocoapods-trunk
$ sudo gem uninstall cocoapods-try
五、常见问题
[!] Invalid Podfile file: undefined local variable or method `en_US' for #<Pod::Podfile:0x00000102a5d8b0>. Updating CocoaPods might fix the issue.
原因:单引号格式,可能是手动输入导致
解决办法:系统偏好设置-键盘-文本-将“使用智能引号和破折号”一项取消勾选-再将podfile里面的单(双)引号修改一下[!] The YMTea [Release] target overrides the OTHER_LDFLAGS build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation
原因:项目 Target 中做了一些设置,CocoaPods 也做了默认的设置,如果两个设置结果不一致,就会造成问题
解决方法:想要使用 CocoaPods 中的设置,分别在项目中定义PODS_ROOT 和 Other Linker Flags的地方(build settings),把他们的值用$(inherited)替换掉,进入终端,执行 $ pod update-
[!] Oh no, an error occurred.
It appears to have originated from your Podfile at line 2.
原因:Podfile文件里面 platform 那一行 冒号和ios之间多了一个空格
The dependency **** is not used in any concrete target.
原因:cocoapods升级为1.0以后,Podfile文件书写格式的问题CocoaPods管理的第三方库头文件无法自动补齐问题
解决办法:
Target -> Build Settings ,User Header Search Paths条目中,添加${SRCROOT}或者$(PODS_ROOT),并且选择Recursive,递归搜索,然后就可以自动补齐了。framework not found Pods_ChainsProject
解决办法:
在终端cd到工程目录下执行以下命令
1 . pod deintegrate
2 . pod install
高级用法
指定源
CocoaPods支持私有 Spec 仓库的,我们可以建立自己的源,也可以使用非官方的源,只要是符合规定的都可以指定。
source 'https://github.com/artsy/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
抑制警告
inhibit_warnings参数能够有效的抑制CocoaPods引入的第三方代码库产生的warning。
inhibit_all_warnings!
全部指定
pod 'ReactiveCocoa', '~> 2.4', :inhibit_warnings => true
针对指定。
pod 'ISO8601DateFormatter', :head
使用git的HEAD指向的分支
pod 'ARAnalytics/Mixpanel', :git => 'https://github.com/orta/ARAnalytics.git'
使用 master 分支
pod 'Reachability', :git => 'https://github.com/ashfurrow/Reachability.git', :branch => 'frameworks'
指定branch
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'
指定tag
pod 'ARTiledImageView', :git => 'https://github.com/dblockARTiledImageView', :commit => '1a31b864d1d56b1aaed0816c10bb55cf2e078bb8'
指定commit使用子库
pod 'QueryKit/Attribute'
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
指定多个子库使用本地代码
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
通过:path可以指定本地代码,不过需要确保目录包含podspec文件。指定target的依赖库
target :ZipApp do
pod 'SSZipArchive'
end
- 排除taget
target 'Artsy Tests', :exclusive => true do
pod 'FBSnapshotTestCase', '1.4'
end
- 指定连接的target
如果不显式指定连接的target,Pods会默认连接project的第一个target。如果需要,可以使用link_with指定连接一个或多个target
link_with 'MyApp', 'MyOtherApp'
- 指定环境
如下只会在Debug环境下面加入PonyDebugger库到工程。
pod 'PonyDebugger', :configuration => ['Debug']
- 指定target的配置文件
xcodeproj 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
使用Dynamic Frameworks代替Static Libraries
通过标志use_frameworks!
可开启这个功能。如果需要使用Swift的库,就必须加上这个标志了。加快pod install/update 速度
使用CocoaPods来添加第三方类库,无论是执行pod install
还是pod update
很多时候都卡在了Analyzing dependencies不动,这是更新本地的pod spec索引文件导致的。通过--no-repo-update
标志可以不更新本地pod spec索引。当然首次install不应该添加这个标志,后续修改Podfile的时候可以适当使用,加快pod速度。
pod install --no-repo-update
pod update --no-repo-update
- 输出详细日志
pod update --verbose