Установка наследующего внешнего вида WKWebView для InterfaceStyle: .Dark в macOS 10.13 (или iOS 12) и более ранних версиях. - PullRequest
0 голосов
/ 12 апреля 2020

В настоящее время у меня есть проект, основанный на веб-приложении , встроенном в 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 опция на вкладке Элементы Инспектора. Интересно, как они работают с функциональностью этой кнопки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...