iOS 静态与动态框架说明
iOS Static vs Dynamic frameworks clarifications
我不得不承认,随着 iOS 8 的发布,我对 iOS 中的动态和静态框架有点困惑。
我正在寻找一种分发我创建的库的方法,我需要支持 iOS 7 及更高版本。 (注意:这将是一个专有框架。我不能使用 cocoa pods,我也不能分发源代码)。这是我已经知道的:
- iOS 8 为 iOS 引入了 "embedded frameworks",但据我了解,它们不适用于 iOS 7,仅适用于 iOS 8及以上。
- 我可以选择将我的库作为静态库(.a 文件)分发,也可以分发 headers。我知道这是处理这种情况的常用方法,但我想找到比这更简单的方法(如果可能的话,还可以捆绑一些资源)。
- 我还发现 iOS 7 不支持动态 .framework 库(仅静态),因为它不支持动态链接。但是 iOS 8 和静态链接一样。
以下是我关于此信息的问题:
- 我看到我可以创建一个 .framework 目标,并将其设为静态,方法是将 Mach-O 类型更改为“静态库”。这足以支持 iOS 7 而无需有什么问题,以及将我的库作为 .framework 包分发吗?如果是这样,为什么 "embedded frameworks" in iOS 8 如此重要,正如互联网上的许多资源所暗示的那样?我错过了吗什么东西?
- 是否有必要像对我制作的任何其他应用程序一样对 .framework 进行代码签名?
- 如果我需要在我的 .framework 文件中包含其他资源(如核心数据或图像)怎么办?我需要为此制作一个单独的 .bundle 文件吗?
我不知道所有的答案,但我会尝试在这里解决您的一些问题。
您将在 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
名称中的 static
或 dynamic
通常指向 Linking
[About] 类型
框架可以是 static
或 dynamic
[Check static or dynamic]
您可以通过将 Framework target -> Build Settings -> Mach-O Type
更改为 Static Library
或 Dynamic Library
来更改将对 Linker
产生影响的库格式。默认情况下 Xcode 具有 Dynamic Library
值。
根据此设置将生成不同类型的二进制文件
成功配置消费者后[Link vs Embed]
Static Linker
ld: 在编译时会将static library
中的所有代码包含到可执行目标文件中。
Dynamic Linker
dyld: at load/run time will try to find the embedded framework using @rpath
[About] 和 link 它
[Vocabulary]
我不得不承认,随着 iOS 8 的发布,我对 iOS 中的动态和静态框架有点困惑。
我正在寻找一种分发我创建的库的方法,我需要支持 iOS 7 及更高版本。 (注意:这将是一个专有框架。我不能使用 cocoa pods,我也不能分发源代码)。这是我已经知道的:
- iOS 8 为 iOS 引入了 "embedded frameworks",但据我了解,它们不适用于 iOS 7,仅适用于 iOS 8及以上。
- 我可以选择将我的库作为静态库(.a 文件)分发,也可以分发 headers。我知道这是处理这种情况的常用方法,但我想找到比这更简单的方法(如果可能的话,还可以捆绑一些资源)。
- 我还发现 iOS 7 不支持动态 .framework 库(仅静态),因为它不支持动态链接。但是 iOS 8 和静态链接一样。
以下是我关于此信息的问题:
- 我看到我可以创建一个 .framework 目标,并将其设为静态,方法是将 Mach-O 类型更改为“静态库”。这足以支持 iOS 7 而无需有什么问题,以及将我的库作为 .framework 包分发吗?如果是这样,为什么 "embedded frameworks" in iOS 8 如此重要,正如互联网上的许多资源所暗示的那样?我错过了吗什么东西?
- 是否有必要像对我制作的任何其他应用程序一样对 .framework 进行代码签名?
- 如果我需要在我的 .framework 文件中包含其他资源(如核心数据或图像)怎么办?我需要为此制作一个单独的 .bundle 文件吗?
我不知道所有的答案,但我会尝试在这里解决您的一些问题。
您将在 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
名称中的static
或 dynamic
通常指向 Linking
[About] 类型
框架可以是 static
或 dynamic
[Check static or dynamic]
您可以通过将 Framework target -> Build Settings -> Mach-O Type
Static Library
或 Dynamic Library
来更改将对 Linker
产生影响的库格式。默认情况下 Xcode 具有 Dynamic Library
值。
根据此设置将生成不同类型的二进制文件
成功配置消费者后[Link vs Embed]
Static Linker
ld: 在编译时会将static library
中的所有代码包含到可执行目标文件中。
Dynamic Linker
dyld: at load/run time will try to find the embedded framework using @rpath
[About] 和 link 它
[Vocabulary]