【问题标题】:Please explain the purpose of Always Embed Swift Standard Libraries请解释 Always Embed Swift 标准库的目的
【发布时间】:2020-12-30 16:44:30
【问题描述】:

我以为我明白 Always Embed Swift Standard Libraries 在做什么,但现在我很困惑。

我将 MacOS 应用程序的更新推送到 App Store,一位用户说他在 macOS High Sierra 上崩溃了。经过非常快速的调查,似乎缺少 swift 库,并且我的一个框架是用 swift 编写的(主应用程序是 ObjC)。我将Always Embed Swift Standard Libraries 切换到YES,重新上传了一个新版本,世界上的一切都很棒。

我现在已经将一个全新的iOS 应用程序上传到Testflight,它是为iOS 9.3+ 构建的,并且记得这个问题,所以我想测试一下。 Always Embed Swift Standard Libraries 设置设置为 NO,这必须是 Xcode 默认值。我通过TestFlightiOS 9.3.2 设备上下载了该应用程序,希望它在启动时崩溃,但不,该应用程序运行良好。

macOS 应用程序如何在 macOS 后面的 1 个主要版本上运行时崩溃,但 iOS 应用程序可以在 iOS 后面的 4 个主要版本上运行得很好?

我完全误解了这个设置的作用吗?

我们什么时候应该使用Always Embed Swift Standard Libraries

----- 编辑 我刚刚检查了.app 的内容,它似乎确实有 swift 库,这可以解释为什么 t 没有在iOS 9.3.2 上崩溃。所以还有一个问题。当 Always Embed Swift Standard Libraries 设置为 NO 时,为什么 swift 库会在那里?

【问题讨论】:

    标签: ios swift macos


    【解决方案1】:

    我不得不多次阅读documentation,以了解发生了什么:

    始终嵌入 Swift 标准库 (ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES)

    始终将 Swift 标准库嵌入到目标的产品中,即使目标不包含任何 Swift 代码。

    这意味着

    • 如果将ALWAYS...设置为YES,则库肯定会被嵌入。
    • 如果您将其设置为 NO,它们将不会始终嵌入 - 它们可能会或可能不会嵌入,这取决于构建系统能够多么聪明地决定它是否需要它们或也不是(取决于目标版本左右)。

    这是一个常见的误解:always 的反义词是 not never,它只是 not away (例如有时左右)。

    【讨论】:

    • 所以如果使用 swift 代码或 swift 库构建应用程序,您不妨始终将其设置为 YES?
    • 不,如果你使用 swift 代码,构建系统会知道它需要库(取决于目标 iOS),所以如果你将它设置为 NO,它也应该可以工作。请参阅文档:此设置仅适用于包装产品,不适用于独立的二进制产品。
    • 但结果会一样吗?如果你知道你需要它们,不妨说是。是否有哪些 iOS/MacOS 版本不再需要捆绑 swift 库的列表?
    • 关于swift.org/blog/abi-stability-and-apple 似乎从 Swift 5(可能还有 macOS 10.14.4、iOS 12.2、tvOS 12.2、watchOS 5.2)开始,标准库将包含在操作系统中,因此你赢了不再需要它们了。
    • 当你说“总是相反”时,小迂腐的吹毛求疵:应该使用“否定”而不是“相反”这个词。 always 的反义词实际上是“从不”。 always 的否定是“不总是”。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    相关资源
    最近更新 更多