使用Cocoapods 踩过的坑

Posted by Lazy Blog on July 4, 2018

iOS组件化系列

  1. 《使用Cocoapods创建私有podspec》

  2. 《使用Cocoapods 踩过的坑》

  3. 《定时取源码执行pod lib lint校验》
  4. 《cocoapods依赖关系导出》

  5. 《iOS 组件二进制》

使用Cocoapods 踩过的坑

Cocoapods 是iOS开发第三方库管理事实上的标准,惭愧的是一直停留在很浅层应用,这两天因为工作需要接触稍多,现在已是头破血流,伤痕累累。为了小伙伴们少走弯路,也为了自己方便以后查看,现简单记录一下踩过的坑。

pod lib lint 能过 , 但是 repo push 过不了

pod lib lint 能过 , 但是repo push 过不了,提示错误

1
2
3
    - ERROR | [iOS] [BPBaseFuncLib/OCR] file patterns: The `vendored_frameworks` pattern did not match any file.  
    - ERROR | [iOS] [BPBaseFuncLib/OCR] file patterns: The `public_header_files` pattern did not match any file.
    - ERROR | [iOS] [BPBaseFuncLib/OCR] file patterns: The `resource_bundles` pattern for `OCR` did not match any file.

依照提示,查看本地文件夹没有问题,百思不得其解。还以为是缓存问题没有更新。原因是git 没有push,repo push 走的是网络验证,pod lib lint 走的是本地验证。因为没有推上去,当然找不到文件。

引用不到最新更新的代码

这时候,可以试试 新打一个tag,然后重新推一把。 也可以试试pod update,问题来了,pod install 和 pod upate 有啥区别?

[Xcodeproj] Generated duplicate UUIDs:

Podfile 加上

1
2
install! 'cocoapods', :deterministic_uuids => false

即可,这个我还不知道是啥意思

podspec 依赖私有库

入股podspec如果有依赖私有库,验证的时候记得带上–source,push 的时候也一样,不然找不到。

1
2
pod lib lint --sources='https://github.com/toolazytoname/Specs.git,https://github.com/CocoaPods/Specs.git' --allow-warnings

pod lib lint 验证出错

pod lib lint 验证出错的时候,当然 error肯定要看,但是note 也很重要,今天就是note提示了找不到文件。

vendored_libraries

表示依赖第三方的静态库, 依赖的第三方的或者自己的静态库文件必须以lib为前缀进行命名 ,否则会找不到

1
s.vendored_libraries = 'Library/Classes/libWeChatSDK.a'

target has transitive dependencies that include static binaries

1
2
3
4
5
6
7
8
9
BPMessageCenterLib git:(master) ✗ pod lib lint --sources='http://gitlab.bitautotech.com/WP/Mobile/IOS/Specs.git,https://github.com/CocoaPods/Specs.git' --allow-warnings

 -> BPMessageCenterLib (0.1.0)
    - ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include static binaries: (/private/var/folders/m6/l5q3hp4d24d4vk4xplkcnhmh0000gn/T/CocoaPods-Lint-20180710-38805-dbfvbq-BPMessageCenterLib/Pods/RongCloudIM/RongCloudIM/RongIMKit.framework, /private/var/folders/m6/l5q3hp4d24d4vk4xplkcnhmh0000gn/T/CocoaPods-Lint-20180710-38805-dbfvbq-BPMessageCenterLib/Pods/RongCloudIM/RongCloudIM/libopencore-amrnb.a, and /private/var/folders/m6/l5q3hp4d24d4vk4xplkcnhmh0000gn/T/CocoaPods-Lint-20180710-38805-dbfvbq-BPMessageCenterLib/Pods/RongCloudIM/RongCloudIM/RongIMLib.framework)) during validation.

[!] BPMessageCenterLib did not pass validation, due to 1 error.
You can use the `--no-clean` option to inspect any issue.

[!] 'RongCloudIM' uses the unencrypted http protocol to transfer the Pod. Please be sure you're in a safe network with only trusted hosts in there. Please reach out to the library author to notify them of this security issue.

很简单,加一个

1
--use-libraries

就好了。

Invalid Podfile file: syntax error, unexpected end-of-input, expecting keyword_end.

在Podfile的末尾添加 end

Pod lint fails when containing dynamic-frameworks without simulator architectures

苹果商店会拒绝包含模拟器架构的dynamic-framework,因此只能用包含真机的包,于是就碰到了如上问题,参看#5854 解决办法是加一个

1
--skip-import-validation

pod lib lint 和repo push的验证时间太久

随着使用的深入,pod lib lint 和repo push的验证操作时间太久了,目前还没有好办法。

分析慢的原因

网络慢

  1. 干掉对官方库的依赖,GitLab上搭建一个私有的官方库索引镜像,同时在内网GitLab上把AF啊,SD之类的工程库也建一个镜像(这一步很重要)。目前这个工作由同事手工完成,这个也可以写一个脚本,我看有相应的API。

编译验证慢

  1. 这个没有深入分析

两个第三方库冲突

两个第三方库冲突,项目需要同时引入优酷播放器和友盟,单独引入都没有问题,同时引入会偶发崩溃

日志如下

1
2
3
2018-08-02 11:41:47.220381+0800 BPBaseFuncLib_Example[39063:17508875] Could not successfully update network info during initialization.
2018-08-02 11:41:47.334518+0800 BPBaseFuncLib_Example[39063:17508774] Could not save pasteboard named com.tencent.mqq.api.registerAppPlugin. Error: Error Domain=PBErrorDomain Code=0 "Cannot load representation of type com.tencent.mqq.api.registerAppPlugin" UserInfo={NSLocalizedDescription=Cannot load representation of type com.tencent.mqq.api.registerAppPlugin, NSUnderlyingError=0x6040002545b0 {Error Domain=PBErrorDomain Code=15 "No loader block available for type com.tencent.mqq.api.registerAppPlugin." UserInfo={NSLocalizedDescription=No loader block available for type com.tencent.mqq.api.registerAppPlugin.}}}
(lldb) 

参看优酷文档,可以通过在宿主工程里面直接设置。

1
Other Linker Flags 设置 -force_load  "$(PROJECT_DIR)/path/to/libYouTuMediaPlayerEngineYouku.a"

不知道为什么,我在podspec 里面设置不管用。

1
2
spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }

Subspecs 的理解

代码如下

  s.resource_bundle = { 'BPBaseFuncLib' => 'BPBaseFuncLib/Assets/*' }
  s.subspec 'OCR' do |ss|
    ss.source_files = 'BPBaseFuncLib/Classes/OCR/*','BPBaseFuncLib/Classes/BPBaseFuncBundle/*'
    ss.public_header_files = 'BPBaseFuncLib/Classes/OCR/BPOCRProtocol.h'
    ss.vendored_frameworks =['BPBaseFuncLib/Classes/OCR/lib/AipBase.framework','BPBaseFuncLib/Classes/OCR/lib/IdcardQuality.framework']
  end

在外部直接 BPBaseFuncLib/OCR,竟然找不到BPBaseFuncLib这个bundle,直接写BPBaseFuncLib当然是会有这个bundle的,着让我很费解,参看官方文档Subspecs 和主spec应该是一个继承的关系,先留着,待后续更新吧。

常用命令放着复制粘贴

1
2
3
4
5
pod lib lint --sources='http://gitlab.bitautotech.com/WP/Mobile/IOS/Specs.git,https://github.com/CocoaPods/Specs.git' --allow-warnings --use-libraries --fail-fast --skip-import-validation


pod repo push XXSpecs XXXXXXXLib.podspec --sources='http://gitlab.bitautotech.com/WP/Mobile/IOS/Specs.git,https://github.com/CocoaPods/Specs.git' --allow-warnings --use-libraries  --skip-import-validation

常用命令放着复制粘贴

都看到这里了,说明你很有耐心,来个彩蛋吧,我把上面常用的命令行写成了一个脚本。话还没试过呢,下回用到我会试一下。先放上来。FDRepoPush

参考