1、升级cocoapod时遇到的问题
首先项目是基于cocoapod管理的,由于自己电脑上的pod版本低于项目中使用的pod版本所以无法进行pod install,提示如下信息
The version of CocoaPods used to generate the lockfile is higher than the version of the current executable
因此开始升级pod,执行命令:sudo gem install cocoapods -n /usr/local/bin,又报错了信息如下
通过查询资料后找到了解决办法步骤如下
(1)sudo rm -rf /Library/Developer/CommandLineTools
(2)xcode-select --install
(3)sudo xcodebuild -license accept
(4)open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
2、pod本地私有库使用远程公有库的问题
由于项目中需要使用AFNetworking,所以通过pod进AFN后直接在自己私有库引用报找不见文件的错误,这时需要在自己私有库的podspec文件添加对AFN的依赖
s.dependency "AFNetworking", "~> 3.2.1"
添加依赖后仍报错
这时候只需要打开s.ios.deployment_target 的注释 并 修改自己的 podspec 文件的 s.ios.deployment_target = "9.0"即可
cocoapods私有库配置所遇问题
1、CTMedator不支持macOS
私有库组件需要依赖CTMediator时在podspec文件验证时报错
- ERROR | [OSX] unknown: Encountered an unknown error (The platform of the target
App
(macOS 10.6) is not compatible withCTMediator (28)
, which does not supportmacOS
.
这是说CTMediator不支持macOS,所以需要在podspec文件中指定platform只支持iOS即可
2、Returned an unsuccessful exit code,fatal error: 'xxx.h' file not found
报错信息如下
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code.
- NOTE | [iOS] xcodebuild: xcodebuild: error: Unable to find a destination matching the provided destination specifier:
[!] The spec did not pass validation, due to 1 error.
尝试添加反向引用,升级cocoapods,删除模拟器重新添加都不行
最后修改podspec文件的subspec以后问题得到解决,原因是这个subspec中引用了组件中其他文件导致的问题,subspec引用了其他目录头文件需要添加依赖
3、Unable to find a specification for xxxx
depended upon by xxxx
我们模块化的时候制作自己私有库免不了要依赖其他的私有库,我们通常在验证或者编写的时候就需要使用 podfile 文件添加我们私有库的 source 源
我们的 podspec 文件在写依赖的时候也无法在对应的库后面添加源地址。但是我们可以在验证和提交的时候多写一个参数。
那就是--sources 参数,需要注意的是给--sources 赋值的时候,一定也要带上官方的源
pod spec lint --verbose --allow-warnings --sources=私有库源,官方源
这样验证podspec即可通过
提交索引文件时也许添加sources
pod repo push 本地索引库 索引文件 --sources=私有库源,官方源 --verbose --allow-warnings
4、undefined symbol:OBJC_CLASS$_XXX
错误原因大部分情况下是忘记添加了某个库的.framework,就会出现这个问题。解决办法是xcodeproj->Build Phases->Link Binary With Libraries中增加对应的framework(这里要注意如果在第三方项目已经加入了对应的链接库并且其他设置又正确的情况下,可以尝试一下在主项目中也加入对应的链接库)。
通过排查自己项目发现工具类的组件少上传了一些.a文件,更新工具类的podspec文件上传.a文件
5、pod lib lint/repo push不支持i386编译
本地代码库编译成功但是podspec文件验证时报不支持i386编译错误
1)通过在 podspec 里面设置来绕过 i386 模拟器架构的编译。在 podspec 文件内加入以下代码
s.pod_target_xcconfig = { 'VALID_ARCHS' => 'arm64 armv7 armv7s x86_64' }
pod lint 验证命令添加 --skip-import-validation 参数,lint 将跳过验证 pod 是否可以导入
pod repo push 命令添加 --skip-import-validation 参数,push 将跳过验证 pod 是否可以导入。
2)直接修改源码
1、终端 gem which cocoapods
2、将第一步命令输出的结果去掉最后的文件名cocoapods.rb,将前面的路径加到 open命令的后面, 执行命令后会在Finder打开一个lib文件夹
3、在当前lib目录下有个cocoapods文件夹,进入,validator.rb文件就在这个文件夹里
找到下面代码
修改为command += %w(--help)
然后再执行验证的命令即可
6、私有库文件分层问题
cocoaPods创建私有库的时候,如果私有库中的文件很多,想做到和项目中的文件夹分层,就需要在podSpec文件里面用到s.subspec 'xxx' do |ss|语句来配置。
先看一个文件层级
我们一般在用pod lib create创建完项目后,会生成相应的目录,只要把需要做成私有库的文件夹代码文件放到 classes里面就可以了
不考虑文件分层podspec文件是这样的
s.source_files = 'TestKit/Classes/**/*'
可以看出就是普通写法,按照这么写的话会导致私有库搭建完成并pod导入后,所有的.h .m .xib .png等文件都在一个文件夹里面,并没有我们本地那样的文件夹,这样的pod私有库虽然在正常的使用中并没有任何问题,但是看起来很乱,这个时候我们就需要进行文件分层了,需添加subspec
s.subspec 'Test1' do |ss|
ss.source_files = ''TestKit/Classes/Test1/*.{h,m}''
end
Test2文件夹下的文件会引用到Test1里面的头文件,所以需要在Test2里添加依赖
s.subspec 'Test2' do |ss|
ss.source_files = ''TestKit/Classes/Tes2/*.{h,m}''
ss.dependency 'TestKit/Test1'
end
需要注意的几个问题
1)一个就是如果有A subspec需要使用到其他的B subspec,就需要在A subspec下面添加对B subspec的依赖,这个依赖是针对subspec的,不需要写本地文件路劲
2)依赖其他第三方公开pod库的话,可以写在使用到的subspec里面,也可以写在总的依赖里
3)如果A subspec里面有使用到B subspec下的文件,B subspec又引用到A subspec下的文件,这样的话,分层实现起来比较困难,解决的思路可以在classes下面创建一个.h的头文件,引用各个头文件,并设置 s.souce_files = 'TestKit/Classes/xxx.h'