“不嵌入”、“嵌入并签名”、“不签名嵌入”。这些是啥?。他们做啥?

Posted

技术标签:

【中文标题】“不嵌入”、“嵌入并签名”、“不签名嵌入”。这些是啥?。他们做啥?【英文标题】:"Do Not Embed", "Embed & Sign", "Embed Without Signing". What are they?. What they do?“不嵌入”、“嵌入并签名”、“不签名嵌入”。这些是什么?。他们做什么? 【发布时间】:2020-01-01 08:56:15 【问题描述】:

我们在 Xcode11 Beta 的“框架、库和嵌入式内容”部分提供了 3 个新选项,用于添加库。

Xcode 库部分截图

谁能解释一下他们是做什么的?

【问题讨论】:

我猜“嵌入”的意思是“复制到应用程序包中”。我还猜想“签名”位实际上意味着使用您的凭据“重新签名”。 【参考方案1】:

完整的故事holyswift

了解更多details

【讨论】:

【参考方案2】:

Xcode v11。框架、库和嵌入式内容以及嵌入与不嵌入的框架和库

历史

Embedded Binaries, Linked Frameworks and Libraries -> Frameworks, Libraries, and Embedded Content

[Xcode pre-v11. Embedded Binaries, Linked Frameworks and Libraries] 一直存在到 General 选项卡中的 Xcode v11 部分

Dependency管理[About]的一部分

Xcode v11 有:

应用目标 - Frameworks, Libraries, and Embedded Content 框架或应用扩展目标 - Frameworks and Libraries

嵌入

嵌入

它将框架的副本添加到您的最终包中。之后Dynamic linker :dyld加载或运行时 尝试使用@rpath[About] 查找嵌入式框架 如果找不到,则会出现错误[dyld: Library not loaded]

EmbedBuild Phases -> Embed Frameworks 的镜像。在这里你可以设置bundle的文件夹和Subpath

请勿嵌入

Static Linker 在编译时尝试使用Build Settings -> Framework Search Paths 将代码从静态库复制到可执行目标文件中

Do Not EmbedBuild Phases -> Link Binary With Libraries 的镜像。 SignCode Sign On Copy 的镜像

如果你没有在这个部分添加static framework,你会得到一个编译错误[No such module]

结果:

静态库 静态框架 - 请勿嵌入 动态框架 - 嵌入

*请注意Embedding的优先级高于Mach-O Type[About]

应用程序的Frameworks, Libraries...Embed 和框架的Mach-OStatic Library - 结果动态框架。 应用程序的Frameworks, Libraries...Do Not Embed 和框架的Mach-ODynamic Library 和- 结果错误dyld: Library not loaded[About]
App's Embed (Dynamic) -> Framework's Mach-O Static - Dynamic
App's Do Not Embed(Static) -> Framework's Mach-O Dynamic - error

[Static vs Dynamic linker][When use Link and Embed][Vocabulary]

【讨论】:

【参考方案3】:

基本上在 Xcode 10 的项目设置中(单击 .xcodeproj 文件,带有蓝色图标),您可以看到两个面向框架的部分 - 嵌入式二进制文件和链接框架和库。现在它们合并为一个。

Do Not Embed 选项基本上是将给定的 .framework 链接到项目中。

Embed & SignEmbed Without Signing 是旧的嵌入选项。

我不完全确定最后两者之间的功能区别是什么,除了框架在组装期间会或不会被签名的事实。如果您想知道链接和嵌入之间的区别,那么 here 您可以在此找到 SO 答案。

图片:

【讨论】:

之前在“链接框架和库”下的选项是“必需”和“可选”“必需”是否与“不嵌入”相同? @RBz no, optional status 支持早期版本作为弱依赖。查看手册:developer.apple.com/library/archive/documentation/MacOSX/…【参考方案4】:

正如@przemyslaw-jablonski 所述,这类似于 XCode 10 中的内容,但仅在一个屏幕中(我个人喜欢!)。


嵌入

不要嵌入静态框架和库(链接发生在构建时),只嵌入共享的(动态链接发生在运行时,所以它们需要在你的包中)。

file frameworkToLink.framework/frameworkToLink 将返回:

current ar archive:静态库,选择Do not embed Mach-O dynamically linked:共享库,选择Embed

签名(仅在共享/嵌入时)

如果已经有适当的签名则不需要(即席不算)。

codesign -dv frameworkToLink.framework 将返回:

code object is not signed at alladhoc:选择Embed and sign 其他:已经正确签名,选择Embed Without Signing

【讨论】:

如果file 的结果是Mach-O universal binary,应该怎么选? 对于codesign,我发现如果框架是用adhoc签名的,还是需要签名的,否则应用程序无法启动。 @Mint:通用二进制意味着它下面有不同的架构。下面的架构应该告诉你它们是档案还是动态库 这是否也适用于标准框架,例如 AdSupport.framework 还是应该将它们设置为“不嵌入”,因为它们已经存在于设备上?跨度> 好问题。那个框架不是静态的?如果您知道它可以在目标系统上使用,我相信您不应该嵌入它,即使它是共享的。最好的了解方法是在不嵌入它的情况下进行测试,如果它无法加载该库,它将在运行时抱怨。请让我们知道,以便我们可以相应地编辑答案!

以上是关于“不嵌入”、“嵌入并签名”、“不签名嵌入”。这些是啥?。他们做啥?的主要内容,如果未能解决你的问题,请参考以下文章

在java中运行pig而不嵌入pig脚本

Swift - 从左到右的 Segue 转换而不嵌入导航控制器

Flex项目release后图片资源不见了–图片资源采用嵌入与不嵌入的区别

Apollo 客户端片段不嵌入数据

Vue.cli 修改 webpack 以在构建期间不嵌入 json 文件?

winForm窗体嵌入U3d