我正在尝试检测系统是否处于暗模式。我已经尝试从用户默认值即[>读取AppleInterfaceStyle
]
NSString *interfaceStyle = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"]; BOOL isDark = [@"dark" caseInsensitiveCompare:interfaceStyle] == NSOrderedSame;
大多数时间都有效,但是在Catalina的
Auto
模式下有问题。
现在,我读到的是,更健壮的方法是检查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
指定了版本。根据我的发现,this issue与我的基本相同,但我不太了解提交所带来的解决方案。
我想它与-isysroot
和-platform_version
有关。但是我没有找到关于它们的工作方式和工作方式的任何参考。
我更新的问题将是:
-isysroot
和-platform_version
如何工作,如何使用它们通过我的二进制文件启用SDK特定功能?
我正在尝试检测系统是否处于暗模式。我已经尝试从用户默认值(即NSString * interfaceStyle = [[NSUserDefaults ...