【问题标题】:Xcode macOS Development Target version and actual compatibilityXcode macOS Development Target 版本和实际兼容性
【发布时间】:2021-09-19 23:20:42
【问题描述】:

我用 Swift 写了一个屏幕保护程序。

虽然我已将 macOS 部署目标设置为 macOS 10.13,但它无法在运行 macOS High Sierra 10.13.6 的 x86_64 Mid 2010 Mac Pro 上运行。

同时,它在装有 macOS Big Sur 11.5.2 的 arm64 2020 MBP M1 和装有 macOS Catalina 10.15.6 的 x86_64 2019 MacBook Air 上运行良好。

屏幕保护程序在所有机器上都能正常安装,但在运行 High Sierra 的机器上却说屏幕保护程序不兼容。

显示的错误消息如下(“vibe”是我制​​作的屏幕保护程序的名称。因此,遇到相同问题的任何其他人都会看到类似的消息,但用他们自己的屏幕保护程序的名称代替当然):

此版本的 macOS 无法使用 vibe 屏幕保护程序。

请联系供应商以获取更新版本的屏幕保护程序。

我想知道是否有一种方法可以自动确定我的代码使用的 API 或其他功能是否在 macOS 10.13 中不可用。而且我想知道您是否通常可以为给定的 macOS 部署目标构建,然后当您尝试在应支持的范围内的机器上运行该程序时,该程序毕竟不会运行。我原以为如果构建的程序无法在其上运行,则为 macOS 部署目标构建会出现构建时间错误。

我正在使用在我的 MBP M1、macOS 11.5.2 上运行的 Xcode 12.5.1,并且如前所述,我正在为设置为 macOS 10.13 的 macOS 部署目标构建。屏幕保护程序在带有 macOS 10.15 的 Intel 和带有 macOS 11.5 的 ARM 上运行良好。我正在使用 Swift 语言版本 Swift 5。

【问题讨论】:

  • 你有没有尝试过在 Console.app 周围查看是否记录了任何有趣的内容?
  • 特别有趣,因为它说“联系供应商以获得更新”.. 更新意味着与旧系统的兼容性更差。除了 Quartz 之外,您还使用哪些 API 会很有趣。如果您可以从 Xcode11.3 中获得针对 osx10.13 的编译版本,那么理论上您至少可以比较这两个版本以获得一些线索。
  • @Alexander 感谢您在 Console.app 中浏览的建议,我确实在那里找到了一些高度相关的信息。将用我发现的内容发布我自己的问题的答案。
  • @OlSen RE:“联系供应商以获取更新”。是的 :P 有一段时间,这个措辞也让我觉得可能 macOS 10.13 对胖二进制文件感到困惑,因为 macOS 10.13 是在 macOS 的 arm64 版本之前发布的。我在想也许它以某种方式得出了胖二进制=旧的结论,因为它们曾经使为powerpc + intel构建胖二进制成为可能。但后来我意识到这可能不是原因,因为我认为他们可能已经将 arm64 + intel fat 二进制文件与 iOS 模拟器结合使用。此外,我认为可能是苹果
  • @OlSen (cont. from prev. comment) Apple 可能已经使 Mach-O fat 二进制格式向前兼容,因为他们的操作系统将忽略所有其他存在的架构,因此在任何情况下在未来,他们可以为未来的架构制作嵌入二进制文件的胖二进制文件,同时允许旧版本的 macOS 为他们自己的架构加载嵌入的二进制文件,而不会产生混淆。

标签: swift xcode macos


【解决方案1】:

解决方案

在我想要运行屏幕保护程序的 macOS 10.13 机器上从 https://support.apple.com/kb/dl1998?locale=en_US 安装“Swift 5 Runtime Support for Command Line Tools”。

背景、细节和替代解决方案

感谢@Alexander 的评论,他建议:

您是否尝试过查看 Console.app 以查看是否记录了任何有趣的内容?

我想通了。

在 Console.app 中,在显示计算机设备消息的默认视图中,我对屏幕保护程序名称的任何出现应用了搜索过滤器,然后在系统偏好设置 > 桌面和屏幕保护程序中,我选择了我的屏幕保护程序和单击“预览”,希望这会导致日志中出现某些内容。确实如此!

相关日志信息:

加载 /Users/erikn/Library/Screen Savers/vibe.saver/Contents/MacOS/vibe 时出错:dlopen(/Users/erikn/Library/Screen Savers/vibe.saver/Contents/MacOS/vibe,265):库未加载:@rpath/libswiftCore.dylib

引用自:/Users/erikn/Library/Screen Savers/vibe.saver/Contents/MacOS/vibe

原因:图片未找到

有了这个,我就可以在dyld: Library not loaded: @rpath/libswiftCore.dylib / Image not found找到类似的根本原因和一些建议的解决方案

这相当于将“始终嵌入 Swift 标准库”设置为 YES,并且还可能将 @executable_path/Frameworks 添加到 Runpath Search Paths

这可能是一种可接受的方式。

但是,不知道这将如何在其他系统上交互的具体细节,我有点犹豫。

幸运的是,我随后找到了 https://developer.apple.com/forums/thread/687847,虽然没有直接相关性,但它指示我寻找“Swift 5 Runtime Support for Command Line Tools”,因为这将为 macOS 10.13 提供缺少的 libswiftCore.dylib。

【讨论】:

  • 我不熟悉屏幕保护程序系统,但我将分享一个在我尝试在 Swift 中实现快速查看生成器时可能有用的花絮(在最近的一些API 增强功能使这一切成为可能)。快速查看生成器作为插件运行到单个进程quicklookd。由于它只有一个进程,因此只能动态链接一个版本的 Swift 标准库。这意味着您安装的所有快速查看插件都必须使用完全相同的 Swift 版本,否则它们将无法工作。跨度>
  • ... 如果屏幕保护程序以类似的“加载到单个服务器/守护进程中的插件包”的方式运行,那么它们可能具有相同的限制。
  • @Erik N 不错的答案,这也可以说明为什么我在开发使用 WKWebkit 和通过在旧系统上运行的 objC 的旧 Webkit 的屏幕保护程序时没有遇到同样的麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2019-08-27
  • 2023-03-03
  • 2015-04-18
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多