使用第三方静态框架作为单个框架构建Swift动态框架

sem*_*kus 7 frameworks dynamic-linking static-linking ios swift

试图为我的客户准备一个动态框架.我的框架(A.framework)使用第三方识别静态框架(B.framework).我无法向客户提供单独的A和B框架.理想情况下,应该构建B.framework并将其包含在我的A.framework的二进制文件中,因此客户的应用程序只会嵌入A.framework,而无需任何其他操作来链接该第三方应用程序.

我做了什么:

  1. 为项目添加了B.framework.
  2. 将B.framework添加到相应目标中的"链接框架和库".
  3. 内置A.framework.
  4. 创建了一个演示应用程序,并将A.framework包含在项目中.
  5. 将A.framework添加到"嵌入式二进制文件".
  6. 演示应用程序的构建失败,并显示消息"Missing required module'B'"(尽管它仅在A.framework中使用).

注意:

  • 我既没有为B.framework创建任何模块映射文件,也没有为其他运行脚本创建
  • 使A.framework静态是不可接受的,因为它包含一些资源(故事板,图标和一些其他文件)
  • 试图制作不推荐的"伞"框架,但在演示应用程序中加载B.framework的包
  • 试图通过在A.framework中简单地复制B.framework来制作虚假的"伞形"框架,但是在导出演示应用程序时出现了2个问题 - 大小的A.framework和Mach-O错误(因为动态A之间的Mach-O差异)和静态B框架)

任何想法都将受到高度赞赏!

UPD 1:这不是关于伞框架,因为正确的伞框架实现需要从bundle加载子框架,这是不好的.由于不同的Mach-O值(动态和静态),虚假框架实现(子框架简单地复制到伞)将不适用于发布.假伞框架具有巨大的尺寸,因为子框架被完全复制到伞内.

UPD 2:创建了一个小型测试项目:StaticFrameworkTest,它有3个子项目:

  1. 具有动态框架依赖性的演示应用程序(框架A),并且不应该对框架B有任何了解
  2. 具有静态框架依赖性(框架B)的动态框架,理想情况下应包含在框架的二进制文件中.
  3. 静态框架B.

小智 4

根据定义,静态框架是与任何其他所需资源相结合的胖静态库。因此,您可以将第三方静态库嵌入到您自己的静态库中,还可以包含图像、故事板、plist 等。

您不能在静态库(即 *.a)中执行此操作,但在静态框架中可以执行此操作。有关如何执行此操作的详细信息,请参阅例如https://www.raywenderlich.com/65964/create-a-framework-for-ios (在文章末尾,它从 static * 创建静态 *.framework .a 和一些资源)

动态框架永远不能嵌入第三方静态库。导入动态框架的主应用程序始终必须显式链接到静态库,这似乎不是您想要的。

  • **> 动态框架永远不能嵌入第三方静态库。** 我认为这是一个不正确的说法。动态框架 *可以* 嵌入静态二进制文件(库或框架),然后应用程序不需要了解有关此静态依赖项的任何信息。然后,静态二进制文件将被嵌入 == 与动态二进制符号合并,这正是静态二进制文件通常所做的。我找不到证明或反驳这一点的文档,但我们的项目中确实有这个设置并且它有效。 (8认同)