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

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

Xcode 库部分截图

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

【问题讨论】:

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

标签: ios frameworks code-signing xcode11 ios-app-extension


【解决方案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 答案。

      图片:

      【讨论】:

      【解决方案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 还是应该将它们设置为“不嵌入”,因为它们已经存在于设备上?跨度>
      • 好问题。那个框架不是静态的?如果您知道它可以在目标系统上使用,我相信您不应该嵌入它,即使它是共享的。最好的了解方法是在不嵌入它的情况下进行测试,如果它无法加载该库,它将在运行时抱怨。请让我们知道,以便我们可以相应地编辑答案!
      猜你喜欢
      • 1970-01-01
      • 2020-05-25
      • 2010-09-16
      • 2021-04-28
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多