В настоящее время у меня есть проект, основанный на веб-приложении , встроенном в WKWebView. При запуске пользователем NSApplication.appearance
приложения будет переключаться между .aqua
светлым режимом и .darkAqua
темным режимом ( см. Apple Docs ). Поскольку веб-приложение настроено на наследование родительского контейнера, веб-приложение будет переключаться между своим собственным светлым и темным режимом, подчиняясь тому, что делает приложение.
Однако сегодня я начал добавлять поддержку macOS 10.13 и ниже (эквивалентно, в данном случае iOS 12 и ниже). Так как Apple выпустила Dark Mode только в macOS 10.14 (iOS 13), у меня возникают проблемы с принудительным переключением веб-приложения в темный режим (так как светлый режим является единственным вариантом в предыдущих версиях macOS). Аналогично, Apple представила только Dark Mode на iOS 13; однако, если в веб-приложении уже есть функция Dark Mode, должен быть какой-то способ обеспечить его на устройстве с iOS 12, нет?
Есть ли способ, которым я мог бы go насильно заставить сообщая контенту, встроенному в WKWebView, что его родительский контейнер работает в темном режиме? Может быть, через ключ-значение или JavaScript оценка?
Key-Value
ie. Установка прозрачного фона WKWebView: webView.setValue(false, forKey: "drawsBackground")
Что я собираюсь сделать:
webView.setValue(1, forKey: "appearance") // where 0 is light mode
webView.setValue(currentMode.Dark, forKey: "InterfaceStyle")
webView.setValue("Dark", forKey: "AppleInterfaceStyle")
enum InterfaceStyle: String {
case Dark, Light
init() {
let type = UserDefaults.standard.string(forKey: "AppleInterfaceStyle") ?? "Light"
self = InterfaceStyle(rawValue: type)!
}
}
let currentMode = InterfaceStyle()
Однако, это также может быть проблематично c, так как светлый / темный режим динамически изменяется, в зависимости от того, когда пользователь переключает свой системный NSAppearance (или переключается в темный режим, в моем приложении, с кодом ниже).
JavaScript оценка
В качестве альтернативы, возможно, есть способ сделать это через JavaScript оценку WKWebView ?
Для справки, рассматриваемое веб-приложение - это Apple Musi c Web Player . При переключении внешнего вида приложения с помощью NSAppearance(named: .darkAqua)
весь пользовательский интерфейс веб-плеера переключается в темный режим в режиме реального времени.
Это то, что у меня пока есть:
let App = NSApplication.shared
func setDarkMode(_ mode: Bool) {
if #available(OSX 10.14, *) {
if mode {
App.appearance = NSAppearance(named: .darkAqua) // Force Dark Mode UI
} else {
App.appearance = NSAppearance(named: .aqua) // Force Light Mode UI
}
} else { print("System running macOS 10.13 or earlier, Dark Mode is disabled") }
}
Я не совсем уверен, где go отсюда. Должен быть какой-то способ заставить контент WKWebView работать в темном режиме без выделенных свойств NS/UIAppearance
, представленных в macOS 10.14 и iOS 13.
Не стесняйтесь также просматривать код на GitHub: https://github.com/revblaze/AppleMusicUltra
РЕДАКТИРОВАТЬ: Apple Safari теперь включает Force Dark Mode опция на вкладке Элементы Инспектора. Интересно, как они работают с функциональностью этой кнопки?