从命令行编译时将 SDK 版本写入二进制文件 (macOS)
Write SDK version to binary when compiling from command line (macOS)
我正在尝试检测系统是否处于黑暗模式。
我已经尝试从用户默认值读取 AppleInterfaceStyle
即
NSString *interfaceStyle = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
BOOL isDark = [@"dark" caseInsensitiveCompare:interfaceStyle] == NSOrderedSame;
大部分时间都有效,但在 Catalina 的 Auto
模式下有问题。
现在,据我所知,更可靠的方法是检查 NSApplication
的 effectiveAppearance
,如下所示:
NSApplication *app = [NSApplication sharedApplication];
NSAppearance *appearance = app.effectiveAppearance;
NSAppearanceName appearanceName = [appearance bestMatchFromAppearancesWithNames:@[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]];
BOOL isDark = [appearanceName isEqualToString:NSAppearanceNameDarkAqua];
这种方法的问题在于,我为此编写的应用程序手动设置了它的 appearance
属性,这会阻止 effectiveAppearance
使用系统外观。
我在检查 effectiveAppearance
之前尝试设置 app.appearance = nil
但它没有帮助。
现在还有[NSAppearance currentAppearance]
,它使用当前线程的外观。如果线程没有明确设置值,我不太确定这个值会解析成什么。
我的大问题是我无法访问计算机 运行 macOS 来检查我的代码,所以如果有人知道在这里做什么,我将不胜感激。
编辑:问题似乎是库未针对正确版本的 SDK 进行编译。或者至少那个版本没有写入库信息。
If you build your app against an earlier SDK but still want to support Dark Mode, include the NSRequiresAquaSystemAppearance key (with a value of NO) in your app's Info.plist file. Do so only if your app's appearance looks correct when running in macOS 10.14 and later with Dark Mode enabled.
我已经通过-mmacosx-version-min=10.14
指定了版本。据我发现this issue和我的基本一样,但是我不太明白提交的解决方案是什么。
我想这与-isysroot
和-platform_version
有关。但是我没有找到任何关于他们做什么以及他们如何工作的好参考。
我更新后的问题是:
-isysroot
和 -platform_version
是如何工作的,我如何使用它们来启用我的二进制文件的 SDK 特定功能?
解决方法很简单。从命令行手动编译时 -mmacosx-version-min=10.14
需要传递给编译器和链接器。
我正在尝试检测系统是否处于黑暗模式。
我已经尝试从用户默认值读取 AppleInterfaceStyle
即
NSString *interfaceStyle = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
BOOL isDark = [@"dark" caseInsensitiveCompare:interfaceStyle] == NSOrderedSame;
大部分时间都有效,但在 Catalina 的 Auto
模式下有问题。
现在,据我所知,更可靠的方法是检查 NSApplication
的 effectiveAppearance
,如下所示:
NSApplication *app = [NSApplication sharedApplication];
NSAppearance *appearance = app.effectiveAppearance;
NSAppearanceName appearanceName = [appearance bestMatchFromAppearancesWithNames:@[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]];
BOOL isDark = [appearanceName isEqualToString:NSAppearanceNameDarkAqua];
这种方法的问题在于,我为此编写的应用程序手动设置了它的 appearance
属性,这会阻止 effectiveAppearance
使用系统外观。
我在检查 effectiveAppearance
之前尝试设置 app.appearance = nil
但它没有帮助。
现在还有[NSAppearance currentAppearance]
,它使用当前线程的外观。如果线程没有明确设置值,我不太确定这个值会解析成什么。
我的大问题是我无法访问计算机 运行 macOS 来检查我的代码,所以如果有人知道在这里做什么,我将不胜感激。
编辑:问题似乎是库未针对正确版本的 SDK 进行编译。或者至少那个版本没有写入库信息。
If you build your app against an earlier SDK but still want to support Dark Mode, include the NSRequiresAquaSystemAppearance key (with a value of NO) in your app's Info.plist file. Do so only if your app's appearance looks correct when running in macOS 10.14 and later with Dark Mode enabled.
我已经通过-mmacosx-version-min=10.14
指定了版本。据我发现this issue和我的基本一样,但是我不太明白提交的解决方案是什么。
我想这与-isysroot
和-platform_version
有关。但是我没有找到任何关于他们做什么以及他们如何工作的好参考。
我更新后的问题是:
-isysroot
和 -platform_version
是如何工作的,我如何使用它们来启用我的二进制文件的 SDK 特定功能?
解决方法很简单。从命令行手动编译时 -mmacosx-version-min=10.14
需要传递给编译器和链接器。