如何通过CocoaPods将AFNetworking作为框架包含在iOS应用程序和扩展中

13

NB: 此问题与项目结构相关,参见此问题,但我决定大幅度扩展使用案例以更好地抽象问题。

问题

如何通过CocoaPods将包含在我的iOS应用和其附带的iOS扩展()中?

问题

  • 在Extension中使用,AFNetworking需要使用#define AF_APP_EXTENSIONS进行构建,这是否意味着我需要两个版本的AFNetworking?一个用于Extension,一个用于App?

  • 如何设置Podfile以便将框架构建并复制到正确的位置?关于use_frameworks!的文档有点单薄。


1
对于未来遇到此问题的人:截至撰写本文时,AFNetworking 在其最新版本中似乎已经解决了这个问题,因此在尝试下面的解决方案之前,请尝试更新 pod。 - ftvs
3个回答

13

更新:

正如Rhythmic Fistman所提到的,当进行新的pod install时,原始答案的方法会被覆盖。

Aelam 在这个 Github 问题中提供了以下方法:

在你的podfile中添加以下内容。记得替换目标名称。

post_install do |installer_representation|
    installer_representation.project.targets.each do |target|
        if target.name == "Pods-YOU_EXTENSION_TARGET-AFNetworking"
            target.build_configurations.each do |config|
                    config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
            end
        end
    end
end

过时的答案:

1)请确保在您的podfile中为容器应用程序和扩展程序都包含pod 'AFNetworking'

例如,在我的情况下:

target 'ContainerAppTarget', :exclusive => true do
  pod "SDKThatInternallyUsesAFNetworking"
end

target 'ExtensionTarget', :exclusive => true do
   pod 'AFNetworking'
end

2) 在XCode中,点击层次结构视图上的Pods以获取其构建选项。然后在构建选项中,在下拉菜单中选择您正在查看构建选项的目标。在那里选择 Pods-{Extension Target Name}-AFNetworking(它应该已经由pod install自动创建)。然后选择Build Settings。然后在Apple LLVM 6.0 - Language下,验证前缀头文件是否有文件名。在我的情况下,该文件名为Target Support Files/Pods-{Extension Target Name}-AFNetworking/Pods-{Extension Target Name}-AFNetworking-prefix.pch。如果没有类似的文件名,则添加它。

3) 转到那个被命名或添加的前缀头文件。它几乎是空的,然后在末尾添加以下行:

#define AF_APP_EXTENSIONS

这将允许您的容器应用程序指向通常构建的AFNetworking版本,而您的扩展应用程序则指向设置了标志的另一个版本。因此,只有一个库的版本,但在两个不同的目标上以两种不同的方式构建。


4
每次执行pod install时,都会重新生成pch文件,这将覆盖您的修改。请注意保留备份。 - Rhythmic Fistman
你是我的英雄。 - Mike
在安装CocoaPods时,我遇到了以下问题: [!] 无法找到SDKThatInternallyUsesAFNetworking的规范。请问我需要用其他什么东西来替换SDKThatInternallyUsesAFNetworking吗? - Geet
@Geet SDKThatInternallyUsesAFNetworking 只是一个示例名称,用于表示内部使用 AFNetworking 的 pod。没有这样的名称。 - ZeMoon
在我的今天的扩展中导入AFNetworking时仍然出现错误。#import <AFNetworking/AFNetworking.h> - kidsid49

9

对于这篇文章的新读者,有些事情已经发生了变化。

我曾花费相当多的时间在困境中挣扎,希望这篇文章能够使你们免于同样的命运。

Cocoapods发生了改变,现在每个Pod只生成一个库,因此为了正确设置AF_APP_EXTENSIONS宏,实际上需要在AFNetworking目标中设置,而不是你的扩展目标中设置。

例如(带有一些漂亮的日志语句):

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        puts "=== #{target.name}"
        if target.name == "AFNetworking"
            puts "Setting AFNetworking Macro AF_APP_EXTENSIONS so that it doesn't use UIApplication in extension."
            target.build_configurations.each do |config|
                puts "Setting AF_APP_EXTENSIONS macro in config: #{config}"
                config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
            end
        end
    end
end

值得一提的是在 installer_representation.pods_project.targets.each do |target| 中的 pods_project

Cocoapods 已经弃用了 project , 并且已被更改为 pods_project

唯一的缺点是 AFNetworking 在容器应用程序中也不会使用任何 UIApplication API,但这在我的项目中不是问题。

希望能对你有所帮助。


新手确实如此。在我找到这篇文章之前,我四处寻找解决方案。感谢这个更新! - ZeMoon
没问题!很高兴能帮到你! - julianwyz
1
"这样做的一个小缺点是,AFNetworking 在容器应用程序中也不会使用任何 UIApplication API,但在我的项目中这并不是问题。所以,这并没有回答原来的问题。" - thisiscrazy4
1
原始问题是“如何通过CocoaPods在我的iOS应用程序和相应的iOS扩展(ios8-extention、ios8-today-widget或ios8-share-extension)中包含afnetworking?”我相信我的答案解决了这个问题。话虽如此,AFNetworking使用的唯一UIApplication API是setNetworkActivityIndicatorVisible:,因此如果您确实想要包含它,那么在加载开始时添加[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];,并在完成时添加[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];即可。 - julianwyz
在我的今天的扩展中导入AFNetworking时仍然出现错误。#import <AFNetworking/AFNetworking.h> - kidsid49
显示剩余2条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接