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

时间:2018-06-22 11:51:30

标签: ios swift frameworks static-linking dynamic-linking

试图为我的客户准备一个动态框架。我的框架(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. 演示应用程序的构建失败,并显示消息“缺少所需的模块'B'”(尽管事实是它仅在A.framework中使用)。

注意:

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

任何想法都会受到赞赏!

UPD 1 :这与伞式框架无关,因为正确的伞式框架实现需要从捆绑中加载子框架,这不是很好。由于动态和静态Mach-O值不同,伪造的框架实现(子框架只是复制到伞形)将无法发布。再加上假伞框架的规模很大,因为子框架已完全复制到伞中。

UPD 2 :创建了一个小型测试项目:StaticFrameworkTest,其中包含3个子项目:

  1. 具有动态框架依赖性的演示应用程序(框架A),并且对框架B一无所知
  2. 具有静态框架相关性的动态框架(框架B),理想情况下应包含在A框架的二进制文件中。
  3. 静态框架B

1 个答案:

答案 0 :(得分:3)

根据定义,静态框架是胖的静态库,结合了任何其他所需的资源。这样,您可以将第三方静态库嵌入您自己的中,并且还包括图像,情节提要,plist等。

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

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

相关问题