WKWebView не запускает JavaScript в фоновом режиме

Я заметил, что иногда, когда веб-представление перемещается в фоновый режим (на нем есть другой контроллер представления), оно останавливает выполнение функций JavaScript и выполняет их только при возврате на передний план.
здесь поток с похожей проблемой, но большинство решений было чем-то вроде взлома, например, добавление веб-просмотра в окно ключа или циклический вызов фиктивных вызовов для оценки JavaScript, чтобы веб-просмотр не переходил в режим ожидания и не останавливал JavaScript.
Между прочим, эти решения работают, но они мне совсем не нравятся.
Мне было интересно, есть ли лучшее решение для этой проблемы, любой способ настроить webView для предотвращения перехода в режим ожидания или более элегантный способ расставить приоритеты JavaScript.
Благодарю.

Ответы

Ответ 1

К сожалению, WKWebView должен быть в иерархии представления, чтобы использовать его. Вы, должно быть, добавили его как вспомогательный вид контроллера экранного представления.

Вы можете добавить это за кадром, чтобы оно не было видно. Скрытый атрибут тоже мог бы сработать. В любом случае вы должны вызвать addSubview с ним, чтобы он работал.

Здесь есть и другие вопросы и ответы , которые подтверждают это.

Итак, я немного исследовал и нашел это

WKWebViewConfiguration* webViewConfig = // set up config

// provide empty frame rect
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero 
configuration:webViewConfig];

// add to keyWindow to ensure it is 'active'
[UIApplication.sharedApplication.keyWindow addSubview:webView];

Этот подход, по крайней мере, обеспечивает работу JavaScript, когда приложение активно, и не влияет на пользовательский интерфейс. Если вам нужно отобразить его позже, вы можете удалить webView из keyWindow после рендеринга и сбросить фрейм.

Надеюсь, это поможет!

EDIT

Javascript по умолчанию отключен. Чтобы запустить Javascript, необходимо включить его через WKPreferences. Вам необходимо установить в поле javascriptEnabled объекта предпочтений значение true.

В частности, ваш код для инициализации WKWebView должен выглядеть следующим образом.

let contentController = WKUserContentController()
contentController.add(self, name: "handler") 

let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
configuration.preferences = WKPreferences()
configuration.preferences.javaScriptEnabled = true

webview = WKWebView(frame: self.view.frame, configuration: configuration)
webview.uiDelegate = self
webview.navigationDelegate = self
self.view = self.webview

Также вы можете проверить этот пост, чтобы увидеть другой подход.