构建 Swift 个动态框架与第三方静态框架作为一个单独的框架
Build Swift dynamic framework with third party static framework as a single framework
正在尝试为我的客户准备一个单一的动态框架。我的框架(A.framework)使用了第三方识别静态框架(B.framework)。我无法向客户提供单独的 A 和 B 框架。
理想情况下,应该构建 B.framework 并将其包含到我的 A.framework 二进制文件中,这样客户的应用程序只会嵌入 A.framework,而无需对 link 与该第三方应用程序进行任何其他操作.
我做了什么:
- 已将 B.framework 添加到项目中。
- 在相应的目标中将B.framework添加到"Linked Frameworks and Libraries"。
- 建成A.framework。
- 创建了一个演示应用程序并将 A.framework 包含到项目中。
- 已将 A.framework 添加到 "Embedded Binaries"。
- 演示应用程序的构建失败并显示消息 "Missing required module 'B'"(尽管它仅在 A.framework 中使用)。
注:
- 我既没有为 B.framework 创建任何模块映射文件,也没有创建额外的 运行 脚本
- 制作 A.framework 静态是不可接受的,因为它包含一些资源(故事板、图标和一些其他文件)
- 试图制作不推荐的 "umbrella" 框架,但在演示应用程序中加载 B.framework 的包时卡住了
- 试图通过简单地在 A.framework 中复制 B.framework 来制作伪造的 "umbrella" 框架,但遇到了 2 个问题 - A.framework 的巨大尺寸和导出时的 Mach-O 错误演示应用程序(由于动态 A 和静态 B 框架之间的 Mach-O 差异)
如有任何想法,我们将不胜感激!
UPD 1:这与伞式框架无关,因为正确的伞式框架实现需要从包中加载子框架,这并不好。由于不同的 Mach-O 值 - 动态和静态,虚假框架实现(子框架简单地复制到 umbrella)将无法用于发布。再加上假伞框架体积庞大,因为子框架被完全复制到伞内。
UPD 2:创建了一个小型测试项目:StaticFrameworkTest,其中有 3 个子项目:
- 具有动态框架依赖性(框架 A)的演示应用程序,不应该对框架 B 有任何了解
- 具有静态框架依赖性的动态框架(框架 B),理想情况下应包含在框架 A 的二进制文件中。
- 静态框架B
根据定义,静态框架是一个包含任何其他所需资源的胖静态库。因此,您可以将第三方静态库嵌入到您自己的 中,还可以包括图像、故事板、plist 等。
您不能在静态库(即 *.a)中执行此操作,但在静态框架中可以执行此操作。
有关如何执行此操作的详细信息,请参见示例 https://www.raywenderlich.com/65964/create-a-framework-for-ios(在文章末尾,它从静态 *.a 和一些资源中创建了静态 *.framework)
动态框架永远不能嵌入第三方静态库。导入动态框架的主应用程序总是必须显式地link反对静态库,这似乎不是你想要的。
正在尝试为我的客户准备一个单一的动态框架。我的框架(A.framework)使用了第三方识别静态框架(B.framework)。我无法向客户提供单独的 A 和 B 框架。 理想情况下,应该构建 B.framework 并将其包含到我的 A.framework 二进制文件中,这样客户的应用程序只会嵌入 A.framework,而无需对 link 与该第三方应用程序进行任何其他操作.
我做了什么:
- 已将 B.framework 添加到项目中。
- 在相应的目标中将B.framework添加到"Linked Frameworks and Libraries"。
- 建成A.framework。
- 创建了一个演示应用程序并将 A.framework 包含到项目中。
- 已将 A.framework 添加到 "Embedded Binaries"。
- 演示应用程序的构建失败并显示消息 "Missing required module 'B'"(尽管它仅在 A.framework 中使用)。
注:
- 我既没有为 B.framework 创建任何模块映射文件,也没有创建额外的 运行 脚本
- 制作 A.framework 静态是不可接受的,因为它包含一些资源(故事板、图标和一些其他文件)
- 试图制作不推荐的 "umbrella" 框架,但在演示应用程序中加载 B.framework 的包时卡住了
- 试图通过简单地在 A.framework 中复制 B.framework 来制作伪造的 "umbrella" 框架,但遇到了 2 个问题 - A.framework 的巨大尺寸和导出时的 Mach-O 错误演示应用程序(由于动态 A 和静态 B 框架之间的 Mach-O 差异)
如有任何想法,我们将不胜感激!
UPD 1:这与伞式框架无关,因为正确的伞式框架实现需要从包中加载子框架,这并不好。由于不同的 Mach-O 值 - 动态和静态,虚假框架实现(子框架简单地复制到 umbrella)将无法用于发布。再加上假伞框架体积庞大,因为子框架被完全复制到伞内。
UPD 2:创建了一个小型测试项目:StaticFrameworkTest,其中有 3 个子项目:
- 具有动态框架依赖性(框架 A)的演示应用程序,不应该对框架 B 有任何了解
- 具有静态框架依赖性的动态框架(框架 B),理想情况下应包含在框架 A 的二进制文件中。
- 静态框架B
根据定义,静态框架是一个包含任何其他所需资源的胖静态库。因此,您可以将第三方静态库嵌入到您自己的 中,还可以包括图像、故事板、plist 等。
您不能在静态库(即 *.a)中执行此操作,但在静态框架中可以执行此操作。 有关如何执行此操作的详细信息,请参见示例 https://www.raywenderlich.com/65964/create-a-framework-for-ios(在文章末尾,它从静态 *.a 和一些资源中创建了静态 *.framework)
动态框架永远不能嵌入第三方静态库。导入动态框架的主应用程序总是必须显式地link反对静态库,这似乎不是你想要的。