Я пытаюсь определить, находится ли система в темном режиме. Я уже пытался прочитать 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, но все же для поддержки темного режима включите ключ NSRequiresAquaSystemAppearance (со значением NO) в файл Info.plist вашего приложения. Делайте это только в том случае, если внешний вид вашего приложения выглядит корректно при работе в macOS 10.14 и более поздних версиях с включенным Dark Mode.
Я уже указываю версию через -mmacosx-version-min=10.14
. Из того, что я обнаружил , эта проблема в основном та же, что и у меня, но я не совсем понимаю, каково решение от коммита.
Я думаю, это как-то связано с -isysroot
и -platform_version
. Но я не нашел ни одной хорошей ссылки на то, что они делают и как они работают.
Мой обновленный вопрос будет таким:
Как работают -isysroot
и -platform_version
и как мне это сделать использовать их для включения функциональности SDK Speci c с моими двоичными файлами?