首页 > 解决方案 > WKWebView 获取 Javascript 错误

问题描述

有没有办法从 Webview 获取 Javascript 错误?我的意思是以下错误和可能的警告?

JS错误

我使用以下扩展名运行 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不是我要找的!有什么办法可以进入我的应用程序,出现上述错误?非常感谢!

标签: iosswiftuiwebviewwkwebview

解决方案


为了处理错误,我们将向加载到页面中的 HTML 添加一些 JavaScript,以通知我们的本机代码有关错误。

首先,您需要使用脚本消息处理程序设置 Web 视图:

let controller = WKUserContentController()
controller.add(self, name: "error")

let configuration = WKWebViewConfiguration()
configuration.userContentController = controller

let webView = WKWebView(frame: .zero, configuration: configuration)

我在本地创建完整的 HTML 文档并注入以下 JavaScript:

window.onerror = (msg, url, line, column, error) => {
  const message = {
    message: msg,
    url: url,
    line: line,
    column: column,
    error: JSON.stringify(error)
  }

  if (window.webkit) {
    window.webkit.messageHandlers.error.postMessage(message);
  } else {
    console.log("Error:", message);
  }
};

(我有检查和日志,因为我有时会在浏览器中运行生成的 JavaScript。)如果你想将它注入到你不能完全控制的 HTML 中,你也可以使用WKUserContentController添加一个。WKUserScript

接下来,当您将字符串加载到 Web 视图中时,请务必将其localhost用作基本 URL。如果你不这样做,你所有的错误都将是"Script error.".

webView.loadHTMLString(html, baseURL: URL(string: "http://localhost/")!)

现在定义你的WKScriptMessageHandler

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    switch message.name {
    case "error":
        // You should actually handle the error :)
        let error = (message.body as? [String: Any])?["message"] as? String ?? "unknown"
        assertionFailure("JavaScript error: \(error)")
    default:
        assertionFailure("Received invalid message: \(message.name)")
    }
}

对于添加到WKUserContentController.


推荐阅读