基于 CocoaPods 的 Swift 框架依赖问题

28

使用最新版本的CocoaPods(0.36),我可以将用Swift编写的CocoaPods(例如Alamofire)嵌入到我的Swift项目中。 现在,我将自己的自定义框架引入了项目中,它也想依赖于Alamofire。

为了实现这一点,我选择将pods框架作为依赖项添加到自己的框架中:

选择自己嵌入的Swift框架(Swift模块)的目标,在“常规”选项卡中的“链接的框架和库”中将“Pods.framework”添加为“必需品”。

然而,仅此还不足以编译代码,因为在我的Swift框架类中,无法“导入Alamofire”,因为它没有被识别为“可用框架”。

将Pods.debug.xcconfig和Pods.release.xcconfig文件添加到自己的Swift框架目标的配置中,换句话说,更改构建设置来进行所有更改,即CocoaPods对iOS应用程序目标的构建设置所做的所有更改,可以解决问题。

现在可以顺利进行构建。它在模拟器上也可以正常运行,我的嵌入式Swift框架成功地使用了CocoaPods添加的框架。

然而,如果我在设备上运行同样的代码,则会编译和安装顺利完成,但随后在启动时崩溃并出现致命错误:

dyld: Library not loaded: @rpath/Pods.framework/Pods
Referenced from: /private/var/mobile/Containers/Bundle/Application/32D2F1F8-679F-4A5F-8159-28F1C800D0C6/TestingFrameworks.app/Frameworks/mySwiftFramework.framework/mySwiftFramework
Reason: image not found

显然,并非所有可可荚xcconfig文件中的设置都适合添加到我的自定义Swift框架的构建设置中。

但是为什么模拟器可以工作呢?更重要的是,我需要纠正哪个构建设置?

在我看来,我需要更改这个构建设置:

PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods

转成其他东西...


1
你找到解决方案了吗? - Pasta
那么,CocoaPods实际上没有办法在不手动干预构建设置的情况下支持这一点吗?没有办法为这种情况设置Podfile吗? - Brett
在我放弃它(使用Swift 1.2)之后,我从未回头尝试过。所以我无法回答你的问题。 - alex da franca
3个回答

28

我找出了问题所在。嵌入式框架的Frameworks/文件夹中根本没有pods.framework。

这是因为Pods-frameworks.sh实际上没有将东西复制到正确的目录中。

我成功解决了这个问题:

  1. 从构建阶段中删除无用的Embed Pods Frameworks
  2. 添加一个目标设置为Frameworks的复制文件

输入图像描述

就这样!


你移除了名为“Embed Pods Frameworks”的阶段吗? - Pasta
是的,我确实尝试过那个方法,但没有成功。相反,我现在通过将PODs框架添加到“内部”框架目标中来解决了这个问题。唉,唉……我敢肯定我以前试过这个方法。但我不想抱怨,我很高兴它不再在设备上崩溃了 :-) - alex da franca
这里不需要执行步骤1 - 我一开始就没有那个构建阶段。只需执行步骤2即可。 :) - Matthew Quiros
基本上,Pods-frameworks.sh会执行许多操作,其中包括复制框架。问题在于,我认为它没有将框架复制到正确的目录中,因此需要在构建步骤中添加一个复制文件步骤。 - Pasta
我尝试着做这个,但是现在无法构建。它只是说在 /Pods/../build/Debug-iphoneos 中找不到框架(这个目录也不存在,我也不能手动指定该目录)。 - Matthew Davis
显示剩余3条评论

5

对于像我这样的新手,问题中的这一部分可能会让你感到困惑:

将Pods.debug.xcconfig和Pods.release.xcconfig文件添加到自己的Swift框架目标的配置中,换句话说,更改构建设置以执行CocoaPods对iOS应用程序目标的构建设置所做的所有更改,可以解决问题。

要做到这一点:

  1. 在您的自定义嵌入式框架的Xcode项目中,单击文件>新建>文件...>iOS>其他>配置设置文件

  2. 以上步骤需要重复两次。您可以将文件分别命名为Pods.release.xcconfigPods.debug.xcconfig

  3. 在您的项目导航器中,展开Pods Xcode项目>目标支持文件>Pods。您会看到那里有同名的.xcconfig文件。只需将其内容复制到您自定义的嵌入式Swift框架内的同名文件中即可。

  4. 单击您的Swift框架的Xcode项目文件,选择项目目标(蓝色的,而不是黄色的工具箱)>信息>配置

  5. 展开DebugRelease配置。您可能会在Xcode项目下看到两个目标--主框架目标和测试目标。在“基于配置文件”列中,将主目标上的配置文件设置为之前创建的Pods.debugPods.release文件。

enter image description here

然后执行@Pasta答案

更新

如果您正在将自定义嵌入式Swift框架与其他项目一起使用,则此设置将会中断,因为其他项目具有不同的.xcconfig设置(Pods的.framework名称也可能不同)。

我只是在我的框架中添加了Alamofire作为git子模块。 注意:采用git子模块的方式需要您将自定义框架添加到主项目的Embedded Frameworks中,并且还需要从内部向主项目添加Alamofire.framework


2
非常感谢@Pasta和@Matt Quiros的分享,解决了我的问题。所以,我想再分享一下我的情况,希望能有所帮助。 开发环境 Xcode版本9.1(9B55)
部署iOS版本:10.0 问题: 我正在一个名为“MyProject”的项目上工作,在其中使用CocoaPod导入了“Charts”库。同时,在“MyProject”中还导入了一个私有框架“MyFramework”。问题在于,我想在“MyFramework”中使用“Charts”,但Xcode一直告诉我无法识别“Chart”库。 解决方案:

我关闭了'MyProject',打开了'MyFrameWork'和'File' -> 'New' -> 'File...'。创建两个配置文件并将它们放在"*.xcodeproj"文件的同一级别的文件夹中。一个配置文件名为'Pods-MyFramework.debug.xcconfig',另一个配置文件名为'Pods-MyFramework.release.xcconfig'。(文件名可以是任何名称,但我不确定文件的位置是否重要)。以下是磁盘和我的Xcode中的文件结构。

enter image description here

enter image description here

现在,关闭'MyFramework'项目并打开'MyProject'项目,在我的Xcode中,文件结构如下所示。展开'MyProject'级别下的'Pods'文件夹。您将看到一些配置文件,请将它们的内容复制到您刚刚在'MyFramework'项目中创建的配置文件中,debug.config->debug.config,release.config->release.config。

enter image description here

然后,在'MyFramewwork'中的一个'MyViewController'中,我添加了'import Charts',并想在模拟器上尝试一下,结果...通过了。是的!!然后我在同一个视图控制器中添加了一些代码来创建一个柱状图,并在真实设备上成功运行,柱状图显示在屏幕上。然后我尝试了@Pasta提到的最后一步,将'Copy Files'选项添加到'MyProject'的'Build Phases'中,它也在真实设备上成功运行。我再次删除它,它仍然有效。


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