CocoaPods Podfile and podspec configurations

 原创    2020-09-12

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

需求描述

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

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

Podfile configurations

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

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

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

podspec configurations

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

Podspec Syntax Reference - dependency

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

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

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

最佳实践

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

  • 提供不同SDK版本的podspec

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

  • 配置主项目的Podfile

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

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

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

s.dependency 'MYSDK-Debug'
s.dependency 'MYSDK'

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

【题外】pod lib create MYSDK

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

相关文章:

iOS Asset Catalog and Bundle
cocoapods-packager 插件的错误修复和适配
pod package的不足和改进
iOS CoreMotion 传感器开发
由 xpc_connection_send_message_with_reply_sync 超时引发的崩溃

发表留言

您的电子邮箱地址不会被公开,必填项已用*标注。发布的留言可能不会立即公开展示,请耐心等待审核通过。