WKWebView получить ошибки JavaScript - PullRequest
0 голосов
/ 08 мая 2018

Есть ли способ получить ошибки Javascript из Webview? Я имею в виду следующие ошибки и возможные предупреждения?

JS error

Я запускаю код JS со следующим расширением

`` `

extension WKWebView {
    func evaluateJavaScriptWithReturn(_ javaScriptString: String) -> String? {
        var finished = false
        var jsValue: String?

        evaluateJavaScript(javaScriptString) { (result, error) in
            if error == nil {
                if result != nil {
                    jsValue = result as? String
                }
            } else {
                jsValue = nil
            }
            finished = true
        }

        while !finished {
            RunLoop.current.run(mode: .defaultRunLoopMode, before: Date.distantFuture)
        }

        return jsValue
    }
}

`` `

Но error это не то, что я ищу! Есть ли способ получить в моем приложении вышеуказанные ошибки? Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Лучшее решение, которое я нашел, - это использование веб-инспектора Safari. Здесь найдены инструкции здесь .

Я продолжал сталкиваться с Script error. сообщениями с помощью решения Yun CHEN (что было здорово) без полезного контента.

0 голосов
/ 18 декабря 2018

В JavaScript подключите событие window onerror для вызова вашего обработчика сообщений скрипта:

window.onerror = function (msg, url, line) {
    window.webkit.messageHandlers.mylog.postMessage("JS: ERROR:" + msg + " @" + url + ":" + line);
};

Вы можете просто получить «Ошибка сценария». сообщения, что является проблемой разрешений. ( документация ) В зависимости от настроек это можно исправить, добавив разрешение к вашим предпочтениям. Swift:

webView.configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
0 голосов
/ 08 мая 2018

Попробуйте следующим образом.

Сначала , введите код JS, чтобы поймать ошибку в html-содержимом:

window.onerror = function(error) {
  alert(error); // Fire when errors occur. Just a test, not always do this.
};

Секунда , отобразить ошибку в методе делегата WKWebView:

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
    let alertController = UIAlertController(title: "alert", message: message, preferredStyle: UIAlertControllerStyle.alert)
    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil))
    self.present(alertController, animated: true, completion: nil)

    print("An error from web view: \(message)")
}

Не забудьте установить делегата:

webView.uiDelegate = self

Если вы хотите избежать предупреждений, альтернативный способ - использовать метод decidePolicyForNavigationAction для получения обратного вызова JS, который похож на window.open("error://message","_self")

...