“不嵌入”、“嵌入并签名”、“不签名嵌入”。这些是啥?。他们做啥?
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]
Embed
是Build Phases -> Embed Frameworks
的镜像。在这里你可以设置bundle的文件夹和Subpath
。
请勿嵌入
Static Linker
在编译时尝试使用Build Settings -> Framework Search Paths
将代码从静态库复制到可执行目标文件中
Do Not Embed
是Build Phases -> Link Binary With Libraries
的镜像。 Sign
是Code Sign On Copy
的镜像
如果你没有在这个部分添加static framework
,你会得到一个编译错误[No such module]
结果:
静态库 静态框架 - 请勿嵌入 动态框架 - 嵌入*请注意Embedding
的优先级高于Mach-O Type
[About]
Frameworks, Libraries...
是Embed
和框架的Mach-O
是Static Library
- 结果动态框架。
应用程序的Frameworks, Libraries...
是Do Not Embed
和框架的Mach-O
是Dynamic 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 & Sign
和 Embed 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 all
或adhoc
:选择Embed and sign
其他:已经正确签名,选择Embed Without Signing
【讨论】:
如果file
的结果是Mach-O universal binary
,应该怎么选?
对于codesign
,我发现如果框架是用adhoc
签名的,还是需要签名的,否则应用程序无法启动。
@Mint:通用二进制意味着它下面有不同的架构。下面的架构应该告诉你它们是档案还是动态库
这是否也适用于标准框架,例如 AdSupport.framework 还是应该将它们设置为“不嵌入”,因为它们已经存在于设备上?跨度>
好问题。那个框架不是静态的?如果您知道它可以在目标系统上使用,我相信您不应该嵌入它,即使它是共享的。最好的了解方法是在不嵌入它的情况下进行测试,如果它无法加载该库,它将在运行时抱怨。请让我们知道,以便我们可以相应地编辑答案!以上是关于“不嵌入”、“嵌入并签名”、“不签名嵌入”。这些是啥?。他们做啥?的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 从左到右的 Segue 转换而不嵌入导航控制器
Flex项目release后图片资源不见了–图片资源采用嵌入与不嵌入的区别