Cocoapod 0.38.0 和 AFNetworking 2.5 AF_APP_EXTENSIONS 编译错误

Cocoapod 0.38.0 and AFNetworking 2.5 AF_APP_EXTENSIONS compilation error

我的项目有 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 错误。在网上搜索解决方案后,我了解了问题,发现定义'preprocessor macros' AF_APP_EXTENSIONS可以解决问题。

但问题在于:默认情况下,AF_APP_EXTENSIONS 已正确添加到我的 6 app_extensions 中。另一方面,当我浏览 Pods 目标时, 每个 Pods 是分开的 :

- 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

在我做的另一个项目中,所有 pods 都是这样生成的:

- 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

我认为这就是为什么我的 'preprocessor macros' 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 target 被去重。这意味着,不是为每个项目目标 ('Pods-MyApp-AFNetworking'、'Pods-MyExtension-AFNetworking'、...) 构建一个 AFNetworking,而是只生成一个 AFNetworking pod 目标 ('Pods-AFNetworking')。

AFNetworking 需要 'AF_APP_EXTENSIONS' 标记到 GCC_PREPROCESSOR_DEFINITIONS 以在添加到应用程序扩展时进行编译。

在 0.37.2 cocoapod 版本之前,可以通过添加 post-install 例程从项目 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

不幸的是,使用删除重复的 cocoapod 功能,不再可能将 AF_APP_EXTENSIONS 标志单独添加到应用程序扩展 pod 目标。

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

deduplicate_targets: false 

这样,pods 不会被删除重复数据,您可以 post-install 添加 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 => 讨论的问题