Cocoapod 0.38.0和AFNetworking 2.5 AF_APP_EXTENSIONS编译错误

我的项目有9个目标:

- Prod - Prod_app_extension_1 - Prod_app_extension_2 - Beta - Beta_app_extension_1 - Beta_app_extension_2 - Dev - Dev_app_extension_2 - Dev_app_extension_2 

我正在使用0.38.2 cocoapod版本和2.5.4 AFNetworking。

我正在尝试将AFNetworking与cocoapod一起使用,但我在编译时遇到了AF_APP_EXTENSIONS错误。 在网上搜索解决方案后,我理解了问题并发现定义’预处理器宏’ AF_APP_EXTENSIONS可以解决问题。

但这是斗争:默认情况下, AF_APP_EXTENSIONS正确添加到我的6个app_extensions中。 另一方面,当我浏览我的Pods目标时, 每个Pod都是分开的

 - NSDate+TimeAgo - AFNetworking - iRate - AppUtils - Prod - Prod_app_extension_1 - Prod_app_extension_2 - Beta - Beta_app_extension_1 - Beta_app_extension_2 - Dev - Dev_app_extension_2 - Dev_app_extension_2 

在我做的另一个项目中,所有pod都以这种方式生成:

 - Prod - Pods-Prod-NSDate+TimeAgo - Pods-Prod-AFNetworking - Pods-Prod-iRate - Pods-Prod-AppUtils - Prod_app_extension_1 - Pods-Prod_app_extension_1-NSDate+TimeAgo - Pods-Prod_app_extension_1-AFNetworking - Pods-Prod_app_extension_1-iRate - Prod_app_extension_2 - Pods-Prod_app_extension_2-NSDate+TimeAgo - Pods-Prod_app_extension_2-AFNetworking - Pods-Prod_app_extension_2-iRate - Beta - Pods-Beta-NSDate+TimeAgo - Pods-Beta-AFNetworking - Pods-Beta-iRate - Pods-Beta-AppUtils - Beta_app_extension_1 - Pods-Beta_app_extension_1-NSDate+TimeAgo - Pods-Beta_app_extension_1-AFNetworking - Pods-Beta_app_extension_1-iRate - Beta_app_extension_2 - Pods-Beta_app_extension_2-NSDate+TimeAgo - Pods-Beta_app_extension_2-AFNetworking - Pods-Beta_app_extension_2-iRate - Dev - Pods-Dev-NSDate+TimeAgo - Pods-Dev-AFNetworking - Pods-Dev-iRate - Pods-Dev-AppUtils - Dev_app_extension_1 - Pods-Dev_app_extension_1-NSDate+TimeAgo - Pods-Dev_app_extension_1-AFNetworking - Pods-Dev_app_extension_1-iRate - Dev_app_extension_2 - Pods-Dev_app_extension_2-NSDate+TimeAgo - Pods-Dev_app_extension_2-AFNetworking - Pods-Dev_app_extension_2-iRate 

我认为这就是为什么我的’预处理器宏’ AF_APP_EXTENSIONS没有定义到’AFNetworking’Pods目标。

这是我的Podfile:

 platform :ios, '7.0' xcodeproj 'myProj.xcodeproj' def generic_pods pod 'NSDate+TimeAgo' pod 'AFNetworking', '~> 2.0' end def app_pods pod 'iRate' pod 'AppUtils', end target "Prod" do generic_pods app_pods end target "Prod_app_extension_1" do generic_pods end target "Prod_app_extension_2" do generic_pods end target "Beta" do generic_pods app_pods end target "Beta_app_extension_1" do generic_pods end target "Beta_app_extension_2" do generic_pods end target "Dev" do generic_pods app_pods end target "Dev_app_extension_1" do generic_pods end target "Dev_app_extension_2" do generic_pods end 

我不知道问题是什么,这让我发疯了。

由于0.38.0 cocoapod版本,pod目标是重复数据 。 这意味着,不是为每个项目目标(’Pods-MyApp-AFNetworking’,’Pods-MyExtension-AFNetworking’,……)建立AFNetworking,而只生成一个AFNetworking pod目标(’Pods-AFNetworking’)。

AFNetworking在添加到app-extensions时需要将’AF_APP_EXTENSIONS’标志放入GCC_PREPROCESSOR_DEFINITIONS进行编译。

在0.37.2 cocoapod版本之前,可以通过添加安装后例程来添加项目Podfile中的标志:

 post_install do |installer_representation| installer_representation.pods_project.targets.each do |target| if ar.include? target.name target.build_configurations.each do |config| config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1'] end end end end 

遗憾的是,通过去复制cocoapodfunction,不再可以将AF_APP_EXTENSIONS标志分别添加到app extention pod目标。

我发现编译的唯一方法是创建一个文件: 〜/ .cocoapods / config.yaml (当你使用cocoapod时默认不存在,你可以用终端创建它)这个内容:

 deduplicate_targets: false 

这样,pod不会被重复数据删除,您可以在安装后将AF_APP_EXTENSIONS添加到您的应用扩展GCC_PREPROCESSOR_DEFINITIONS中。

我希望他们能找到一个好方法来防止这个问题。

参考:

https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md#highlighted-enhancement-that-needs-testing => cocoapod更改日志

https://github.com/CocoaPods/CocoaPods/issues/3794 =>讨论过的问题