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

标签 ios swift frameworks cocoa-touch

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

现在我有一个测试项目:

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

导入A.framework

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

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

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

import B.framework

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

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

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

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

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

最佳答案

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

A.framework 打包错误。如果你打包了,你应该把嵌入式框架去掉,把应用层的东西都链接起来。如果其他人打包了它,您应该向他们提出问题以更正此错误。这个问题对动态框架来说并不陌生。这同样是静态框架的问题。链接依赖关系的唯一合适时机是在应用层。

(如果您控制整个生态系统(例如 Apple),则异常(exception)。然后像 umbrella frameworks 是可以接受的。但您不是 Apple。)

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

例如:

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

关于ios - 使用嵌入在动态框架中的第三方框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34576706/

相关文章:

swift - 理解核心数据基础知识的问题

ios - Xcode/Swift 4 打开 pdf 文件的静态表格单元格

java - 如何在 OpenXava 中创建复选框?

ios - 如何将 nil 分配给 RealmOptional<Int>

java - 在 Play Framework 上生成管理区域(CRUD)

php - 个人网站的用户友好框架?

iOS CLLocationManager 在一个单独的类中

objective-c - 远程调试 iOS 性能

ios - 如何使用 MKNetworkKit 将 NSArray 传递给 POST

iphone - 旋转拨号器,如iPhone中的iRetro拨号器动画