什么是Xcode中的嵌入式二进制文件?

62
我在Swift项目中使用Alamofire,他们的手动安装说明中的一部分是将Alamofire添加到应用程序目标的嵌入式二进制文件下。

enter image description here

什么是嵌入式二进制文件?
3个回答

56

嵌入式二进制文件是在构建项目时复制到应用程序包中的二进制文件。当您的应用程序依赖于第三方框架时,使用嵌入式二进制文件使人们可以在他们的计算机上使用您的应用程序而无需安装这些框架。嵌入式二进制文件可以让用户不必手动安装第三方框架。您的应用程序将使用您所嵌入的框架。

在您的 Alamofire 示例中,您的应用程序依赖于 Alamofire。如果您没有嵌入 Alamofire 框架,则除非他们手动安装了 Alamofire,否则任何人都无法使用您的应用程序。通过将 Alamofire 嵌入应用程序,每个人都可以运行您的应用程序。


3
我记得在过去的 OS X 上,或者最近在另一个 iOS 第三方框架上,我们的做法是构建框架,然后创建一个复制文件的“Build Phase”,将框架复制到“Frameworks”目录下。这个方法是用来替代那个方法的吗?它似乎比我过去使用的方法更容易一些。 - Doug Richardson
2
是的,它应该替代复制文件构建阶段来复制二进制文件,例如框架、库和命令行工具。 - Swift Dev Journal
1
你看过这个Xcode工具的文档吗?我还没有找到任何相关的。 - Doug Richardson
1
我在XCode 8中发现了一件有趣的事情。 "General -> Embedded binaries" 和 "Build Phases -> Embed Frameworks" 似乎是相互关联的,因为如果你将一个 .framework 拖到其中一个地方,它会自动出现在另一个地方;而且在 "Embed Frameworks" 中它会自动启用 "Code sign on copy"(签名对于构建应用程序归档文件以进行分发非常重要)。 - JustAMartin
不知怎么的,我的应用程序框架出现在“链接的框架”部分,但没有出现在“嵌入式二进制文件”中(我对此一无所知)。我猜自动添加行为JustAMartin描述的情况并没有发生在我身上。花了很长时间观察我的Xcode UI测试失败,并显示错误“dyld:Library not loaded: @rpath/MyFramework.framework ... Reason: image not found”。解决方法是将这些框架也添加到“嵌入式二进制文件”中! - chriskilding
显示剩余4条评论

51
  • “二进制”意味着:编译好的代码——与“源代码”相反,当你用文本编写代码时,你正在使用源代码。

    他们本可以给你源代码并让你自己编译,但是他们没有这么做;他们将源代码保密起来,所以他们在编译后将所有东西都给了你,这样你就无法阅读它。

  • “嵌入式”意味着:通过在构建时将它们复制到应用程序包中,将它们包含在您的应用程序包内。

    所以,他们会把一些已编译的代码(框架)交给你,并告诉你如何将它们包含在你的应用程序包内。这些框架不像Cocoa框架那样已经存在于设备上,因此如果你不将它们包含在应用程序内,它们将不会出现在应用程序中,你的应用程序将无法调用它们。

    相比之下,Cocoa的框架也是编译好的代码。但是它们已经存在于设备上了。因此,它们不会被嵌入到您的应用程序中;它们只是被链接(如果它们出现了,它们将出现在下一个组“链接的框架和库”中)。


1
它们被称为嵌入式“二进制文件”,而不是嵌入式“框架”,这让我认为它们的用途应该比仅限于框架更加广泛。除了框架之外,你知道它们是否还用于其他任何方面吗?此外,你有关于此的文档指引吗?我一直没有找到相关资料。 - Doug Richardson
1
在更一般的情况下,您还可以嵌入库文件。 - matt

5

嵌入二进制文件会将整个框架复制到目标位置。

框架是一个分层目录,将动态库、头文件和资源(如storyboard、图像文件和本地化字符串)封装成单个包。使用框架的应用程序需要在应用程序包中嵌入框架

因此,当您将框架嵌入应用程序时,它会增加应用程序的大小,因为它被复制到应用程序包中。在大多数情况下,我们在使用第三方框架时会使用这些部分。

当我们将框架添加到嵌入式二进制文件中时,它会自动将该框架添加到链接的框架和库中。

有关更多详细信息,请参阅苹果文档:https://developer.apple.com/library/archive/technotes/tn2435/_index.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接