iOS静态和动态框架说明


115

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

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

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

这是我对这些信息的疑问:

  • 我看到我可以通过将Mach-O类型更改为“静态库”来创建一个.framework目标并将其设为静态。这足以支持iOS 7而不会出现任何问题,并且还可以将我的库作为.framework bundle?如果是,为什么Internet上的许多资源表明,iOS 8中的“嵌入式框架”这么重要呢?
  • 是否需要像我对其他任何应用程序所做的那样对.framework进行代码签名?
  • 如果我需要在.framework文件中包含其他资源(如核心数据或图像)怎么办?我需要为此制作一个单独的.bundle文件吗?

1
“ iOS 7不支持.framework库,因为它不支持动态链接。”此声明不正确。
Midhun MP

1
我懂了。你能告诉我正确的句子吗?是因为iOS 7支持动态链接还是因为iOS 7支持.framework库,所以它是错误的吗?或两者?
csotiriou 2015年

1
记住AVFoundation和CoreGraphics都是.framework。也许这可以帮助您找到所有问题的答案:raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP

我修好了这句话。在发布问题之前,我已经阅读了该链接。此链接没有解释关于我的问题的任何内容。它从静态库开始,然后手动将其包装到.framework文件中。我正在谈论Xcode 6中的Cocoa Touch Framework目标,然后将类型更改为静态库。它没有提到代码签名(为什么,如果有必要),额外的资源,等等
csotiriou

1
您可以使用CocoaPods分发专有框架(例如Parse)
Ric Santos,

Answers:


69

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

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

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

至于您对资源的问题,我们需要将它们捆绑在“ .bundle”中。要运输它们,我不确定是否可以将它们封装在.framework文件夹中。静态框架和捆绑...

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

如果使用迅速,则必须使用动态框架。从理论上讲,动态框架可以在iOS7中使用。但是,我认为iTunes Connect将拒绝该应用程序针对的是iOS7并使用动态框架的方法:-)。

希望这可以帮助


16

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


大提示。不知道为什么这个答案被打分了,因为它帮助了我。\ Target'Build Settings \ Mach-O-Type,然后选择静态框架。
rustyMagnet

3
迅速4无法提供Abi兼容性
csotiriou

7

staticdynamic名称通常指向Linking[关于]类型

框架可以staticdynamic[检查静态或动态]

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

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

成功配置使用者后,[链接与嵌入]

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

Dynamic Linker dyld:在加载/运行时将尝试使用@rpath[About]查找嵌入式框架并将其链接

[词汇]


6

Swift在静态库中不起作用。如果必须使用动态框架,则必须将最小iOS设置为8.0,因为 AppStore拒绝使用动态框架的ios 7


您可以将静态库导入到基于
Swift

5

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

  • 您将收到有关在iOS 7中使用这些框架的警告,但这仅是警告。看到这个答案

  • 您可以包括CoreData之类的其他资源,但是您需要手动在代码中创建它们。这是显示如何创建核心数据模型的教程

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.