首页 > 解决方案 > 从命令行编译时将 SDK 版本写入二进制文件 (macOS)

问题描述

我正在尝试检测系统是否处于暗模式。我已经尝试AppleInterfaceStyle从用户默认值中读取,即

    NSString *interfaceStyle = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
    BOOL isDark = [@"dark" caseInsensitiveCompare:interfaceStyle] == NSOrderedSame;

这在大多数情况下都有效,但Auto在 Catalina 模式下存在问题。

现在从我所读到的是,更强大的方法是检查effectiveAppearance其中NSApplication看起来像这样的:

    NSApplication *app = [NSApplication sharedApplication];
    NSAppearance *appearance = app.effectiveAppearance;
    NSAppearanceName appearanceName = [appearance bestMatchFromAppearancesWithNames:@[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]];
    BOOL isDark = [appearanceName isEqualToString:NSAppearanceNameDarkAqua];

这种方法的问题是我正在为其编写的应用程序手动设置其appearance属性,这会阻止effectiveAppearance使用系统外观。app.appearance = nil我在检查之前尝试了设置,effectiveAppearance但没有帮助。

现在还有[NSAppearance currentAppearance]哪个使用当前线程的外观。如果线程没有明确设置该值,我不太确定该值解析为什么。

我的大问题是我无法访问运行 macOS 的机器来检查我的代码,所以如果有人知道在这里做什么,我将不胜感激。


编辑:看起来问题是该库没有针对正确版本的 SDK 进行编译。或者至少该版本没有写入库信息。

文档中:

如果您针对较早的 SDK 构建您的应用程序,但仍希望支持暗模式,请在您的应用程序的 Info.plist 文件中包含 NSRequiresAquaSystemAppearance 键(值为 NO)。仅当您的应用在 macOS 10.14 及更高版本中运行并启用暗模式时看起来正确时才这样做。

我已经通过-mmacosx-version-min=10.14. 根据我的发现,这个问题与我的问题基本相同,但我不太明白提交中的解决方案是什么。

我想这与-isysrootand有关系-platform_version。但是我没有找到任何关于他们做什么以及他们如何工作的好的参考。

我更新的问题是:

如何使用它们-isysroot以及-platform_version如何使用它们在我的二进制文件中启用 SDK 特定功能?

标签: objective-cmacoscompiler-flagsmacos-darkmode

解决方案


解决方案非常简单。从命令行手动编译时-mmacosx-version-min=10.14需要传递给编译器和链接器。


推荐阅读