CocoaPods Podfile and podspec configurations

本文讲解了Cocoapods对不同configurations的支持能力,configurations配置可以让APP在Debug、Release等模式下引入不同的代码或framework,便捷支持不同场景的配置需求。

需求描述

业务方的SDK产品(假设名称为EaseapiSDK)以静态库framework的方式接入至APP,因为业务方的安全考量,SDK提供了两个版本:Release和Debug版本。Release版本是用于正式发布的版本,而Debug版本则作用于开发及功能测试阶段。Debug版本提供了便捷的调试接口,这些在Release版本中都是需要隐藏的。

现在,需要借助Cocoapods的能力来支持这个需求。Cocoapods目前支持对Podfile和podspec配置configurations。

Podfile configurations

在主项目的Podfile中,可以使用configurations命令标记不同配置的接入情况,示例:

pod 'EaseapiSDK-Debug', '1.0.0', :configurations => ['Debug']
pod 'EaseapiSDK', '1.0.0', :configurations => ['Release']

EaseapiSDK-Debug.podspec和EaseapiSDK.podspec中引入的库名称可以是相同的,比如都是EaseapiSDK.framework。在链接阶段只会链接对应配置的EaseapiSDK.framework,不会出现符号重复。

podspec configurations

按照官方文档的说明,在Cocoapods 1.9.0以上的版本,podspec也是支持配置configurations的。

Podspec Syntax Reference - dependency

但是我使用Cocoapods 1.9.3版本验证发现,podspec对configurations语法支持的并不是很好。示例配置:

s.dependency 'EaseapiSDK-Debug', '1.0.0', :configurations => ['Debug']
s.dependency 'EaseapiSDK', '1.0.0', :configurations => ['Release']

使用以上配置,首先提示"target has frameworks with conflicting names",表示引入了相同名称的framework。即使修改framework名称之后,链接时还是会提示符号重复,查看链接命令发现实际上将EaseapiSDK-Debug和EaseapiSDK都链接进去了。不知道是不是使用的方式不对,podspec中dependency的configurations并不能达到在不同配置下依赖不同framework的目的。

最佳实践

如果你有类似的需求,可以参考下面的接入方式。

  • 提供不同SDK版本的podspec

两个版本的framework名称可以是相同的。

  • 配置主项目的Podfile

在Podfile中分别引入不同版本的podspec。

pod 'EaseapiSDK-Debug', '1.0.0', :configurations => ['Debug']
pod 'EaseapiSDK', '1.0.0', :configurations => ['Release']
  • 配置其他pod的podspec

如果其他pod需要使用EaseapiSDK的接口,则需要在对应的podspec文件中添加依赖即可,不需要再指定版本号和configurations。示例:

s.dependency 'EaseapiSDK-Debug'
s.dependency 'EaseapiSDK'

以上操作完成即达到目的。

【题外】pod lib create MyFramework

使用pod lib create命令可以便捷的创建一个pod项目的模版。

其他文章

pod package的不足和改进
iOS Crash log符号化
iOS APP灰度发布方案
Address Sanitizer的原理和使用
iOS URLSession Authentication Challenge及SSL Pinning