我不得不承认,随着iOS 8的发布,我对iOS中的动态和静态框架感到有些困惑。
我正在寻找一种分发我创建的库的方法,我需要支持iOS 7及更高版本。 (注意:这将是一个专有框架。我不能使用可可豆荚,我也不能分发来源)。这是我已经知道的:
以下是关于此信息的问题:
答案 0 :(得分:65)
在iOS8之前,Xcode只允许为iOS创建静态库。与此相关的常见问题是我们必须单独发送二进制文件和标题。
后来,一些开发人员提出了创建静态框架的想法。 [.framework只是一个带有符号链接到lib和标题的文件夹]。其中一个例子是https://github.com/jverkoey/iOS-Framework
此选项适用于iOS 7或8或之前。因为它们只是静态库,便于捆绑头文件。
至于您对资源的问题,我们需要将它们捆绑在' .bundle' ..为了运送它们,我不确定我们是否可以将它们包含在.framework文件夹中。过去我习惯把我的libs作为静态框架发送并捆绑...
但是,如果您使用Swift,上述选项将无效。 Xcode不支持构建包含swift代码的静态库。
如果有快速使用,你必须使用动态框架。从理论上讲,动态框架可以在iOS7中运行。但是,我认为如果应用程序针对iOS7并使用动态框架,iTunes Connect将拒绝: - )。
希望这有帮助
答案 1 :(得分:12)
使用Xcode 9,您也可以为Swift创建静态框架。由于ABI源兼容性,这是可能的。您只需更改框架目标的构建设置下的Mach-O type
即可。
此技术也适用于混合框架(使用Swift和Objective-C代码的框架)。
答案 2 :(得分:6)
Swift在静态库中不起作用。如果必须使用动态框架,则必须将最小iOS设置为8.0 ,因为 AppStore拒绝带有动态框架的 ios 7
答案 3 :(得分:5)
我没有得到所有答案,但我会在这里尝试解决您的一些问题。
答案 4 :(得分:0)
Framework可以是static
或dynamic
,带有库,该库打包成捆,其中包含一些额外的资源,用于版本控制的元描述等。
您可以通过将Linker
[About]更改为Framework target -> Build Settings -> Mach-O Type
或Static Library
来更改对Dynamic Library
有影响的库格式。默认情况下,Xcode的值为Dynamic Library
。
根据此设置,将生成不同类型的二进制文件[check static or dynamic]
成功配置使用者后[Link vs Embed]
Static Linker
ld:在编译时,会将static library
中的所有代码都包含到可执行对象文件中。
Dynamic Linker
dyld:在加载/运行时将尝试使用@rpath
[About]查找嵌入式框架并将其链接