【问题标题】:Does iOS 8 support dynamic linking?iOS 8 是否支持动态链接?
【发布时间】:2014-09-24 16:44:29
【问题描述】:

直到 iOS7,出于安全考虑,Apple 不支持动态链接。开发人员之间的代码重用通常依赖于静态库,这些库是作为应用程序可执行文件的一部分构建的。

在 iOS8 中引入扩展似乎稍微改变了这一点,因为扩展是单独的可执行文件。在扩展程序及其包含的应用程序之间共享代码是通过框架完成的。 Apple 在其发行说明中这样说:

iOS 框架。 iOS 开发者现在可以创建动态框架。 框架是要封装的代码和资源的集合 跨多个项目有价值的功能。构架 与扩展完美配合,共享双方都可以使用的逻辑 主应用程序和捆绑的扩展。

重点是我的。

来源:https://developer.apple.com/library/content/documentation/Xcode/Conceptual/WhatsNewXcode-Archive/Articles/xcode_6_0.html#//apple_ref/doc/uid/TP40014509-SW14

此外,在扩展开发指南中,他们解释说您可以通过“嵌入式框架”在扩展和包含应用程序之间共享代码。

来源:https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

我的问题是——什么是嵌入式框架,它与动态框架有何不同,我们真的会在 iOS8 中看到正确的动态链接吗?我读过的所有文档似乎都对此模棱两可。

【问题讨论】:

  • 我们不允许使用嵌入式框架或一般框架吗???在应用商店中拥有多个使用嵌入式框架的应用,然后在实际应用中添加品牌。还是我误解了你的意思?
  • 启用了框架的使用,但它们都是静态的,这意味着它们是作为可执行文件的一部分构建的。现在我们有了扩展,如果我们继续这样做,应用程序可执行文件和扩展可执行文件将复制框架代码(假设两者都链接框架)。这对我来说很奇怪,所以我问苹果是否改变并允许我们动态链接(即在运行时链接一个无法执行的框架)。此外,他们在该文档中有“动态框架”一词。
  • 好的,我想我明白你的意思了,我不得不通过旧大脑把它包裹好几次才能理解,但我想我明白了,但我想我没有答案,对不起.

标签: ios ios8 ios-frameworks ios-app-extension


【解决方案1】:

“嵌入式”和“动态”框架不是指框架的同一方面。它们不是彼此相反的。首先,让我们定义什么是框架:在苹果的行话中,框架是指一些已编译的代码 + 所述代码的公共标头。

  • 现在,动态 框架是其代码构建为动态库的框架。它与“静态”框架相反,其中代码将构建为静态库。如果您想知道,维基百科有 a very nice explanation 说明静态库和动态库之间的区别。

  • 最后,嵌入式框架是封装在应用程序中的框架,而不是在系统范围内安装,例如在“/System/Library/Frameworks”中。

【讨论】:

  • 尽管措辞可能不同,但这不是同一个概念吗?所有静态框架都必须与您的应用程序代码链接。结果是单个可执行文件,因此您说所有静态框架都是嵌入式框架。那么这并不能回答我的问题。 iOS8 中有非嵌入式动态链接框架吗?
  • 您可以在应用程序之外分发静态框架。以“谷歌分析”为例。 iOS8中是否有非嵌入式的动态链接框架?:当然:所有的系统框架(Foundation、UIKit等...)
【解决方案2】:

嵌入式框架只是包含在应用程序包中的框架,而不是安装在系统目录中的全局框架。

【讨论】:

  • 好的,但在这种情况下,它仍然是一个静态框架。为什么 Apple 在发行说明中使用“动态”一词?
  • @Slavo 对不起;是的,它是动态的。
【解决方案3】:

动态框架并不意味着动态链接框架。应用程序仍然只能在沙盒环境中运行。这不像您的自定义框架将与 iOS 一起安装。使用您开发的通用框架的每个应用程序都将被复制到每个应用程序的捆绑包中。

你可以自己看看。转到 Xcode 的 Derived Data 目录,在应用程序的数据中,您会发现所有已复制的嵌入式框架。

与静态库相比,使用 iOS 8 创建框架的唯一新功能是公共头文件和资产被捆绑在框架中。如果您一直在使用早期版本的 Xcode 执行此类操作,您会记得提供公共标头然后在 Xcode 设置中添加搜索路径以及我们必须在单独的包中传递的资产的痛苦。

我看到的使用框架的唯一缺点是现在我们不能简单地使用 lipo 来为所有类型的架构生成胖静态库。

IMO Apple 使用“动态”一词来暗示“独立”。

观看 WWDC2014 - 构建现代框架了解更多详情。

【讨论】:

  • 动态框架实际上是指动态链接的框架,在iOS/OS X 世界中。只需构建一个示例 iOS 框架并执行“file MyLib.framework/MyLib”,看看它是如何成为 Mach-O 动态链接共享库的。
  • 所以你是说我们编写的所有自定义框架都将动态地提供给其他人使用?
  • 不,iOS 不允许这样做。操作系统不会让您从应用程序的沙箱之外加载动态库。系统框架在沙箱内,但其他应用程序的框架不在。 iOS 8 中引入了框架,让您可以在主应用程序和扩展程序之间共享代码。两者都可以从您的应用程序容器内部加载框架。其他应用不能。
  • 好的@Ecco,我想我现在明白了。从理论上讲,它们是动态链接的,但是操作系统安全机制(沙盒)不允许您链接沙盒之外的任何框架。这些仍然可以在越狱设备上使用吗?
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2015-11-04
  • 1970-01-01
  • 2014-02-04
  • 2020-03-26
相关资源
最近更新 更多