【问题标题】:Swift framework depending on cocoa podSwift 框架依赖于 cocoa pod
【发布时间】:2015-05-21 12:27:46
【问题描述】:

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

我所做的就是选择将 pods 框架作为依赖项添加到我的框架中:

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

但是,这还不足以编译,因为我自己的 swift 框架中的类不能“导入 Alamofire”,因为它不被识别为“可用框架”。

将 Pods.debug.xcconfig 和 Pods.release.xcconfig 文件添加到我自己的 swift 框架的目标的配置中,换句话说,更改构建设置以进行所有更改,可可豆荚对构建进行我的 iOS App 目标的设置,解决了这个问题。

它现在可以毫无问题地构建。它在模拟器中运行也没有问题,我自己的嵌入式 swift 框架成功使用了可可豆添加的框架。

但是,如果我在设备上运行相同的程序,它可以毫无问题地编译和安装,但随后在启动时崩溃并出现致命错误:

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

去别的地方……

【问题讨论】:

  • 你找到解决办法了吗?
  • 那么 CocoaPods 实际上没有办法在不手动弄乱构建设置的情况下支持这一点吗?没有办法为这种情况设置 Podfile?
  • 在我放弃它(使用 Swift 1.2)之后,我再也没有回去尝试过。所以我无法回答你的问题。

标签: ios swift cocoapods


【解决方案1】:

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

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

我设法通过以下方式解决了这个问题:

  1. 从构建阶段移除无用的 Embed Pods 框架
  2. 添加目标设置为框架的副本文件

就是这样!

【讨论】:

  • 感谢分享,但这仍然对我不起作用:-(这是我根据您上述步骤所做的:选择我自己的嵌入式框架的目标并在“构建阶段”中删除 Pods .framework 而是添加了一个“复制文件”阶段并完全按照您在屏幕截图中显示的方式进行设置。在设备上运行时,我仍然收到上述错误:-(
  • 您是否删除了名为 Embed Pods Frameworks 的阶段?
  • 是的,我确实尝试过,但无济于事。相反,我现在能够通过将 PODs 框架添加到“内部”框架目标来解决这个问题。 Ts,ts...我确定我以前曾尝试过。但我不想抱怨,我很高兴,它不再在设备上崩溃了 :-)
  • 这里不必执行第 1 步——我一开始就没有那个构建阶段。只需执行第 2 步即可。 :)
  • 有效。我希望我知道为什么。那里到底发生了什么?
【解决方案2】:

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

将 Pods.debug.xcconfig 和 Pods.release.xcconfig 文件添加到我自己的 swift 框架的目标的配置中,换句话说,更改构建设置以进行所有更改,可可豆荚对构建进行我的 iOS App 目标的设置,解决了这个问题。

为此:

  1. 在自定义嵌入式框架的 Xcode 项目中,点击File > New > File... > iOS > Other > Configuration Settings File

  2. 上述操作两次。您可以分别将文件命名为Pods.release.xcconfigPods.debug.xcconfig

  3. 在您的项目导航器中,展开 Pods Xcode 项目 > Target Support Files > Pods。您会看到那里有类似名称的.xcconfig 文件。只需将它们的内容复制到自定义嵌入式 Swift 框架内的同名文件即可。

  4. 点击你的Swift框架的Xcode项目文件,选择项目目标(蓝色的,不是黄色的工具箱)>Info>Configurations

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

然后执行@Pastaanswer

更新

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

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

【讨论】:

    【解决方案3】:

    非常感谢分享@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 中的文件结构。

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

    然后在“MyFramewwork”的一个“MyViewController”中,我添加了“import Charts”,只是想在模拟器上试一试,结果……通过了。是的!!然后我在同一个 VC 中添加了一些代码来创建一个条形图,并在真机上成功运行,条形图显示在屏幕上。然后我尝试了@Pasta 提到的最后一步,将“复制文件”选项添加到“MyProject”的“构建阶段”,它也在真实设备上成功运行。我再次删除它仍然有效。

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 2018-04-24
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多