相信各位读了之前的两篇文章,对pods的使用已经相当熟练了。不过在纷繁复杂的实际使用场景下,可能还是会遇到一些问题。本文就结合自己的实践经验,做一些快问快答,希望大家能多多补充交流。话不多说,那我们就即刻开始吧!
pod系列文章
Cocoapods,让iOS开发更简单(一):走近Cocoapods
Cocoapods,让iOS开发更简单(二):创建私有库
Cocoapods,让iOS开发更简单(三):实践经验汇总
一文带你快速分清静态库-动态库-Framework
pods版本
//查看安装的pods版本
pod --version
//更新pods版本
sudo gem install cocoapods
清除本地缓存
//查看本地缓存列表
pod cache list
//清除本地缓存
pod cache clean XXX
灵活多样的版本依赖形式
~> 含义为:大于等于指定的版本号,小于高一位的版本号
eg:
~> 0.1.x :0.2以下 0.1.x以上(包括0.1.x)
pod 'AFNetworking' //不显式指定依赖库版本,表示每次都获取最新版本
pod 'AFNetworking', '2.0' //只使用2.0版本
pod 'AFNetworking', '> 2.0' //使用高于2.0的版本
pod 'AFNetworking', '>= 2.0' //使用大于或等于2.0的版本
pod 'AFNetworking', '< 2.0' //使用小于2.0的版本
pod 'AFNetworking', '<= 2.0' //使用小于或等于2.0的版本
pod 'AFNetworking', '~> 0.1.2' //使用大于等于0.1.2但小于0.2的版本
pod 'AFNetworking', '~>0.1' //使用大于等于0.1但小于1.0的版本
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'//指定远程分支
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'//指定tag
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'//指定commit
pod 'PodTestLibrary', :path => '../../../PodTestLibrary'//指定本地地址
pod 'AFNetworking', '2.0' , :modular_headers => true//设置个别库的modular_headers
子库的依赖
pod 'TestPodLib/aaa','0.1.0'
pod 'TestPodLib', '0.1.0', :subspecs => ['aaa','bbb','ccc']
依赖的稳定性
一般推荐使用指定版本或范围版本号,以确保依赖的稳定性。
pod install&pod update
- pod install:在第一次检索集成第三方以及每一次在Podfile中新增、更改或删除pod的时候使用。每一次执行pod install命令,它都会下载安装新的pod,并且会把每一个安装的pod的版本信息写入Podfile.lock文件。每一次执行pod install命令,对于已在Podfile.lock中列出的pod,会下载指定的版本,不会检查是否有新版本,而没有在Podfile.lock中列出的pod,它会搜索并安装Podfile中指定的版本。
- pod update:会检查安装Podfile中列出的所有pod的新版本(往往比较慢)。
- pod update PODNAME:将PODNAME更新到Podfile中指定的版本,可以是更新到老版本也可以是更新到新版本,取决于Podfile,而不考虑Podfile.lock中记录的版本信息。
总结
:能用pod install解决问题的,就不要用pod update。因为pod update会把依赖库全部检查一遍,不仅慢有时候还会出现坑。
inhibit_all_warnings!
忽略Pods警告,有些第三方Pod集成进来会有一大堆警告信息,在Podfile中对应的target或分组下加上关键字inhibit_all_warnings!就可以把警告忽略。
use_frameworks!
作用:
在pods中用frameworks替代.a静态库。
场景:
swift项目pods默认开启(use_frameworks!),OC项目pods默认关闭(#use_frameworks!),同时需满足以下两点,
- 用pods导入swift框架到swift项目或OC项目都必须要use_frameworks!
- 使用dynamic frameworks,必须要在Podfile文件中添加use_frameworks!
解析:
- 如果在Podfile文件里不使用 use_frameworks! 则会生成相应的 .a文件(静态链接库),通过 static libraries 这个方式来管理pods的代码。Linked:libPods-xxx.a包含了其它用pods导入的第三方框架的.a文件。
#use_frameworks! -> static libraries 方式 -> .a
- 如果使用了use_frameworks! 则pods 会生成相应的 .frameworks文件(动态链接库:头文件 + 动态链接库 + 资源文件),使用 dynamic frameworks 来取代 static libraries 方式。Linked:Pods_xxx.framework包含了其它用pods导入的第三方框架的.framework文件。
use_frameworks! -> dynamic frameworks 方式 -> .framework
- swift不支持.a静态库
use-modular-headers
swift工程依赖了OC工程的话,需要use_modular_headers!
示例:
为某个 Pods 使用模块化标头,可以使用以下语法:
pod 'TestPodLib', :modular_headers => true
另外,当全局使用 use_modular_headers! 属性时,同时还可以使用以下方法从模块化标头中排除特定的Pod:
pod 'TestPodLib', :modular_headers => false
在podspec文件中指定支持的架构
valid_archs = ['armv7s','arm64']
s.xcconfig = {
'VALID_ARCHS' => valid_archs.join(' '),
}
s.pod_target_xcconfig = {
'ARCHS[sdk=iphonesimulator*]' => '$(ARCHS_STANDARD_64_BIT)'
}
版本号规范
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
主版本号:当你做了不兼容的 API 修改,
次版本号:当你做了向下兼容的功能性新增,
修订号:当你做了向下兼容的问题修正。
如何使用pod中素材
常用的方式调用pod中的素材是不生效的,因为默认是从mainBundle中读取的,如
imgView.image = [UIImage imageNamed:@"t.png"];
打在pod中的素材已经不在mainBundle中而在对应组件下的bundle 里面,所以应该这么调用:
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
NSString *path = [currentBundle pathForResource:@"t.png" ofType:nil inDirectory:@"resource.bundle"];
imgView.image = [UIImage imageWithContentsOfFile:path];
引用第三方库中的头文件
在用CocoaPods集成第三方库之后,默认情况下,使用类似#import <XXX/YYY.h>的方式引入第三方库的头文件。
pod search 经常搜索不到的问题
pod search只会搜索本地缓存的库,如果想搜索到最新的第三方框架或者某个框架的最新版本,必须先使用pod repo update。