【问题标题】:Use third party framework which is embedded in dynamic framework使用嵌入在动态框架中的第三方框架
【发布时间】:2016-04-07 05:06:48
【问题描述】:

据我了解,ios 动态框架和静态的最大变化是静态在链接时(启动之前)静态链接到代码,而动态在启动/运行时链接

现在我有一个测试项目:

我的项目有一个与之链接的动态框架 - A.framework。

import A.framework

A.framework 内部嵌入了一个框架 - B.framework

在我的主项目中,我想使用 B.framework 中的类

现在我在主项目中看到了一个简单的导入语句:

import B.framework

它确实有效,我可以使用嵌入在链接 A.framework 中的 B.framework 内部的代码

怎么可能?使用起来安全可靠吗?主项目如何识别B.framework?

主项目直接将B.framework链接到项目的情况呢?在这种情况下,我在链接时看到许多“重复符号错误”

最重要的是,我如何构建 A.framework 而不将 B.framework 嵌入其中,同时使用它的类和函数

任何澄清都会有所帮助:)

【问题讨论】:

    标签: ios swift frameworks cocoa-touch


    【解决方案1】:

    如果您使用多个框架,您可以尝试Cocoa Pods 依赖管理器,它将帮助您访问多个框架。这也将允许您保留断点,这将有助于您甚至在框架内进行调试,并且您还可以进行更改。

    【讨论】:

      【解决方案2】:

      如您所见,链接 B.framework 会导致符号重复。这就是为什么 A.framework 不应该嵌入 B.framework。如果消费应用程序有任何机会关心嵌入式框架(实际上,这意味着你真的不应该这样做),你绝不能将一个框架嵌入到另一个框架中。

      A.framework 打包不正确。如果你打包了它,你应该移除嵌入式框架并链接应用层的所有内容。如果其他人打包了它,您应该向他们提出问题以更正此错误。这个问题对于动态框架来说并不新鲜。这同样是静态框架的问题。链接依赖项的唯一合适时间是在应用层。

      (如果你控制了整个生态系统(例如 Apple),则有一个例外。那么像 umbrella frameworks 这样的东西是可以接受的。但你不是 Apple。)

      编辑:可以将共享框架链接但不能嵌入到另一个共享框架中。关键是共享框架的唯一副本需要来自顶级应用程序。由于最后的链接步骤将在加载时发生,因此您不会有重复的符号,因为共享框架只有一个副本。只是不要将子框架嵌入到您的框架中。

      例如:

      • 使用框架目标创建项目
      • 将 GMA.framework 拖到框架目标(这将导致它链接但不嵌入)
      • 创建应用目标
      • 让应用程序链接 GMA.framework 和您的测试框架。这可以正常工作而不会发生冲突,因为只有一个 GMA.framework,而且它只嵌入在应用中。

      【讨论】:

      • 但是如果我必须在我的 A.framework 中使用来自 B.framework 的代码怎么办?如果我不将 B.framework 链接到 A.framework 我无法使用它的功能,在这种情况下我无法实现我自己,因为它是第三方框架
      • 您只需要将 B import B 到 A。您不必将 B link B 到 A。只要最终的应用程序链接两者B和A,那么一切都会奏效。这就是链接器的用途。框架不必能够解析其所有符号,只要它能够在应用运行时解析它们即可。
      • 问题是,如果不将 B 链接到 A,则框架项目不会构建并得到未定义符号的错误,正如我在那个问题中解释的那样:stackoverflow.com/questions/34609229/…
      • 您是否将 GMA 链​​接到您的最终申请中?你的意思是框架本身没有链接 GMA 就无法构建?我无法重现该问题。在我的测试中,我创建了一个新的框架项目,将另一个框架项目放入其中。使第二个框架成为第一个框架的依赖项,“导入 B”到 A 中,然后在 A 中创建一个“B”对象。它构建得很好。但是任何链接 B 的最终应用程序也需要链接 A。
      • 虽然这项工作,但仅适用于开源,但在构建编译器时仍然尝试将该框架包含到当前框架中,有什么要修复的吗?
      猜你喜欢
      • 2015-09-10
      • 2018-12-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2014-06-21
      • 2014-12-04
      相关资源
      最近更新 更多