iOS 静态与动态框架说明

Posted

技术标签:

【中文标题】iOS 静态与动态框架说明【英文标题】:iOS Static vs Dynamic frameworks clarifications 【发布时间】:2015-03-10 02:09:43 【问题描述】:

我不得不承认,随着 ios 8 的发布,我对 iOS 中的动态和静态框架有些困惑。

我正在寻找一种方法来分发我创建的库,并且我需要支持 iOS 7 及更高版本。 (注意:这将是一个专有框架。我不能使用可可豆荚,也不能分发源代码)。以下是我已经知道的:

iOS 8 为 iOS 引入了“嵌入式框架”,但据我了解,它们不适用于 iOS 7,仅适用于 iOS 8 及更高版本。 我可以选择将我的库作为静态库(.a 文件)分发,也可以分发标头。我知道这是处理这种情况的常用方法,但我想找到比这更简单的方法(如果可能的话,还可以捆绑一些资源)。 我还发现 iOS 7 不支持动态 .framework 库(仅静态),因为它不支持动态链接。但 iOS 8 和静态链接一样。

以下是我关于此信息的问题:

我看到我可以通过将 Mach-O 类型更改为“静态库”来创建一个 .framework 目标并将其设为静态。这样就足以支持 iOS 7 而没有任何问题,并且还可以分发我的作为 .framework 包的库?如果是这样,为什么 iOS 8 中的“嵌入式框架”如此重要,正如互联网上的许多资源所暗示的那样?我错过了什么吗? 是否有必要像对我制作的任何其他应用程序一样对 .framework 进行代码设计? 如果我需要在我的 .framework 文件中包含其他资源(如核心数据或图像)怎么办?我需要为此制作一个单独的 .bundle 文件吗?

【问题讨论】:

“iOS 7 不支持 .framework 库,因为它不支持动态链接” 这个说法不正确。 我明白了。你能告诉我正确的句子吗?是因为 iOS 7 支持动态链接还是因为 iOS 7 支持 .framework 库是错误的?还是两者兼而有之? 记住 AVFoundation 和 CoreGraphics 都是 .framework。可能这可以帮助您找到所有问题的答案:raywenderlich.com/65964/create-a-framework-for-ios 我修正了这句话。在发布我的问题之前,我已经阅读了链接。此链接没有解释有关我的问题的任何内容。它从静态库开始,并手动将其包装到 .framework 文件中。我说的是 Xcode 6 中的 Cocoa Touch Framework 目标,然后将类型更改为静态库。它没有提到代码签名(为什么以及是否需要)、额外资源等。 您可以使用 CocoaPods 分发专有框架(例如 Parse) 【参考方案1】:

在 iOS8 之前,Xcode 只允许为 iOS 创建静态库的选项。常见的问题是我们必须分别发送二进制文件和头文件。

后来,一些开发人员提出了创建“静态框架”的想法。 [.framework 只是一个带有符号链接到 lib 和标题的文件夹]。一个这样的例子是https://github.com/jverkoey/iOS-Framework

此选项适用于 iOS 7 或 8 或更早版本。因为它们只是静态库,可以方便地捆绑头文件。

至于您对资源的问题,我们需要将它们捆绑在“.bundle”中。为了运送它们,我不确定我们是否可以将它们包含在 .framework 文件夹中。过去我曾经运送我的库作为静态框架和捆绑包......

但是,如果您使用 Swift,上述选项将不适合您。 Xcode 不支持构建包含 swift 代码的静态库。

如果要快速使用,您必须使用动态框架。理论上,动态框架在 iOS7 中工作。但是,如果应用程序针对 iOS7 并使用动态框架,我认为 iTunes Connect 会拒绝:-)。

希望对你有帮助

【讨论】:

【参考方案2】:

从 Xcode 9 开始,您也可以为 Swift 创建静态框架。由于 ABI 源兼容性,这是可能的。您需要做的只是更改框架目标的构建设置下的Mach-O type。 这种技术也适用于混合框架(带有 Swift 和 Objective-C 代码的框架)。

【讨论】:

很棒的提示。不知道为什么这个答案对我有帮助而被打分。 \Target'Build Settings\Mach-O-Type 并选择静态框架。 Abi 兼容性在 swift 4 中不可用【参考方案3】:

静态与动态链接

staticdynamic 在名称中通常指向 Linking[About] 类型

框架可以是staticdynamic[Check static or dynamic]

您可以通过将Framework target -> Build Settings -> Mach-O Type[About] 更改为Static LibraryDynamic Library 来更改将对Linker 产生影响的库格式。默认情况下,Xcode 具有 Dynamic Library 值。

取决于此设置,将生成不同类型的二进制文件

成功配置消费者后[Link vs Embed]

Static Linkerld:在编译时会将static library中的所有代码包含到可执行目标文件中。

Dynamic Linkerdyld:在加载/运行时会尝试使用@rpath[About]找到嵌入式框架并链接它

[Vocabulary]

【讨论】:

【参考方案4】:

我没有所有的答案,但我会尝试在这里解决您的一些问题。

在 iOS 7 中使用这些框架时会收到警告,但仅此而已,警告。请参阅此answer。

您可以包含其他资源,例如 CoreData,但是您需要在代码中手动创建它们。这是一个tutorial,展示了如何创建核心数据模型。

您必须为 iOS 编写代码签名动态库。

如果您打算分发它,您需要确保您的框架同时支持模拟器和设备架构。

【讨论】:

【参考方案5】:

Swift 在静态库中不起作用。如果你必须使用动态框架,你必须将 min iOS 设置为 8.0 因为 AppStore 拒绝 ios 7 with dynamic framework

【讨论】:

您可以将静态库导入基于 swift 的项目中

以上是关于iOS 静态与动态框架说明的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8是否支持动态链接?

在 iOS 的动态框架中包含静态库

在动态框架中包含静态库的公共头文件

iOS 上是不是可以使用动态链接框架?

web框架概述与程序开发

Android 插件化Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )