在Swift的iOS中,如何隐藏框架中的依赖框架?

问题描述 投票:1回答:1

我正在寻找一个解决方案,我可以开发一个框架,X,它依赖于框架Y.而X的消费者永远不会知道Y.

目前,我正在构建一个伞形框架。也就是说,Y通过Copy Files构建阶段包含在X的构建中。这会产生以下框架包:

X.framework/
  Frameworks/
    Y.framework/
      Y (binary)
  X (binary)

我遇到的问题是分发。从我的测试来看,如果用户将X复制到他们的项目中,编译器将构建好。但是当他们在设备上运行时,他们会收到此错误:

dyld:未加载库:@ rpath / Y.framework / Y引用自:/private/var/containers/Bundle/Application/ED17DA9C-3A17-44EA-B944-22B1387EB9F7/test.app/Frameworks/X.framework/X

原因:找不到合适的图像。找到了:/private/var/containers/Bundle/Application/ED17DA9C-3A17-44EA-B944-22B1387EB9F7/test.app/Frameworks/X.framework/Frameworks/Y.framework/Y:mmap()错误1 at address = 0x00377000,size = 0x00248000 segment = __ TEXT in Segment :: map()mapping /private/var/containers/Bundle/Application/ED17DA9C-3A17-44EA-B944-22B1387EB9F7/test.app/Frameworks/X.framework/Frameworks/Y .framework / Y

要解决此错误,用户还必须专门将Y复制到其项目中。我们必须通过文档来解决这个问题。

理想情况下,用户根本不需要知道Y.此外,不确定此设置对CocoaPods和Carthage分布的影响程度。是否可以不向用户公开Y?

ios swift xcode frameworks xcode8
1个回答
0
投票

错误消息告诉您出了什么问题。您是主机应用程序test.app,无法加载您在Y.framework/Y中引用的库X.framework/X。这两个框架都是动态的。作为动态,它们将在运行时加载,顾名思义,它们是动态链接的。这解释了错误。该应用程序试图在运行时加载Y.framework/Y,因为它不存在错误发生。

当问到这个问题时,没有办法在快速动态库中做你想做的事。从Xcode 9开始,可以使用swift静态库。可以将库静态链接到动态库以有效地隐藏它。因此,如果您是两个库的作者,您可以实现上面描述的设置。

但是这种方法可能存在问题。如果内部库也可以单独包含在应用程序中,并且内部库定义了引用类型,那么当有效地将两个库副本包含在应用程序中时,一个隐藏在动态库中,将会记录一条警告说明两个参考类型的符号在两个地方定义。

© www.soinside.com 2019 - 2024. All rights reserved.