使用嵌入在动态框架中的第三方框架。

7

据我所知,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 嵌入其中,同时当然还要使用其类和函数

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

1个回答

7
正如您所指出的那样,链接B.framework将导致重复符号。这就是为什么A.framework不应嵌入B.framework的原因。如果使用方会关心嵌入式框架(实际上,这意味着你真的不应该这样做),则永远不要在另一个框架中嵌入框架。
A.framework的打包方式不正确。如果您进行了打包,则应删除嵌入的框架并在应用程序层面上链接所有内容。如果其他人打包了它,则您应该向他们提出问题以更正此错误。这个问题对于动态框架来说并不新鲜。静态框架也同样存在这个问题。链接依赖项的唯一适当时间是在应用程序层面上。
(有一个例外情况,即您控制整个生态系统(例如Apple)。然后像umbrella frameworks这样的东西是可以接受的。但你不是苹果。)
编辑:将共享框架链接到另一个共享框架中是可以的,但不要嵌入子框架。关键在于共享框架的唯一副本必须来自顶级应用程序。由于最终的链接步骤将在加载时发生,因此您不会有重复的符号,因为只有一个共享框架的副本。
例如:
  • 创建带有框架目标的项目
  • 将GMA.framework拖入框架目标中(这将导致它链接但不嵌入)
  • 创建应用程序目标
  • 使应用程序同时链接GMA.framework和您的测试框架。这样做没有冲突,因为只有一个GMA.framework,并且它仅嵌入在应用程序中。

但是如果我必须在A.framework中使用B.framework的代码呢?如果我不将B.framework链接到A.framework,我将无法使用它的功能,而在这种情况下,我也无法自己实现,因为它是第三方框架。 - Michael A
1
你只需要将B 导入 到A中,无需将B链接到A。只要最终应用程序将B和A都链接起来,那么就可以正常工作。这就是链接器的作用。框架不必在解析所有符号时都可解析,只要它能在应用程序运行时解析即可。 - Rob Napier
我的意思是框架本身不会构建,给我未定义的符号。你说的“使第二个框架成为第一个框架的依赖项”是什么意思?在没有链接的情况下,你如何在技术上实现它?我们非常感谢您的帮助,我们的团队已经卡在这个问题上很长时间了。 - Michael A
在这种情况下,第三方框架是GoogleMobileAds.framework。你的意思是我应该创建一个空的框架项目,并将框架放在那里,以便它可以作为我的A框架的依赖项?到目前为止,我所做的只是将其放置在A框架项目路径中。 - Michael A
1
虽然这个方法可以用于开源项目,但编译器在构建时仍会尝试将该框架包含到当前项目中,有没有什么解决办法? - Tj3n
显示剩余5条评论

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