iOS 静态与动态框架说明

iOS Static vs Dynamic frameworks clarifications

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

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

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

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

  • 您将在 iOS 7 中收到有关使用这些框架的警告,但仅此而已,警告。看到这个 answer

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

  • 您必须对 iOS 的动态库进行代码签名。

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

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

后来,一些开发人员产生了创建 'static frameworks' 的想法。 [.framework 只是一个文件夹,其中包含指向 lib 和 headers 的符号链接。一个这样的例子是 https://github.com/jverkoey/iOS-Framework

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

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

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

如果有 swift 用法,则必须使用动态框架。理论上,动态框架在 iOS7 中工作。但是,我认为如果应用程序针对 iOS7 并使用动态框架,iTunes Connect 将拒绝 :-)。

希望对您有所帮助

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

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

静态与动态 linking

名称中的

staticdynamic 通常指向 Linking[About] 类型

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

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

根据此设置将生成不同类型的二进制文件

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

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

Dynamic Linker dyld: at load/run time will try to find the embedded framework using @rpath[About] 和 link 它

[Vocabulary]