swift WKWebView获取JavaScript错误

91zkwejq  于 2024-01-05  发布在  Swift
关注(0)|答案(4)|浏览(170)

有什么方法可以从WebView中获取JavaScript错误吗?我的意思是以下错误和可能的警告?
x1c 0d1x的数据
我正在运行具有以下扩展名的JS代码:

  1. extension WKWebView {
  2. func evaluateJavaScriptWithReturn(_ javaScriptString: String) -> String? {
  3. var finished = false
  4. var jsValue: String?
  5. evaluateJavaScript(javaScriptString) { (result, error) in
  6. if error == nil {
  7. if result != nil {
  8. jsValue = result as? String
  9. }
  10. } else {
  11. jsValue = nil
  12. }
  13. finished = true
  14. }
  15. while !finished {
  16. RunLoop.current.run(mode: .defaultRunLoopMode, before: Date.distantFuture)
  17. }
  18. return jsValue
  19. }
  20. }

字符串
但是error不是我正在寻找的!有没有办法在我的应用程序中,上述错误?非常感谢!

ego6inou

ego6inou1#

为了处理错误,我们将在加载到页面中的HTML中添加一些JavaScript,以通知我们的本地代码有关错误。
首先,您需要使用脚本消息处理程序设置Web视图:

  1. let controller = WKUserContentController()
  2. controller.add(self, name: "error")
  3. let configuration = WKWebViewConfiguration()
  4. configuration.userContentController = controller
  5. let webView = WKWebView(frame: .zero, configuration: configuration)

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

  1. window.onerror = (msg, url, line, column, error) => {
  2. const message = {
  3. message: msg,
  4. url: url,
  5. line: line,
  6. column: column,
  7. error: JSON.stringify(error)
  8. }
  9. if (window.webkit) {
  10. window.webkit.messageHandlers.error.postMessage(message);
  11. } else {
  12. console.log("Error:", message);
  13. }
  14. };


(我有检查和日志,因为我有时在浏览器中运行生成的JavaScript。)如果您想将WKUserScript注入到您不能完全控制的HTML中,您也可以使用WKUserContentController添加WKUserScript
接下来,当你加载一个字符串到你的web视图中时,一定要使用localhost作为基本URL。如果你不这样做,所有的错误都将是"Script error."

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


现在定义您的WKScriptMessageHandler

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


对于添加到WKUserContentController的其他消息,可以在switch语句中添加其他情况。

展开查看全部
dwthyt8l

dwthyt8l2#

试试下面的方法。

首先,注入JS代码捕获html内容中的错误:

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

字符串

其次,显示WKWebView委托方法中的错误:

  1. func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
  2. let alertController = UIAlertController(title: "alert", message: message, preferredStyle: UIAlertControllerStyle.alert)
  3. alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil))
  4. self.present(alertController, animated: true, completion: nil)
  5. print("An error from web view: \(message)")
  6. }


记住设置委托:

  1. webView.uiDelegate = self


如果你想避免警报,另一种方法是使用decidePolicyForNavigationAction方法来接收JS的回调,就像window.open("error://message","_self")一样

展开查看全部
zxlwwiss

zxlwwiss3#

在JavaScript中,挂接window onerror事件以回调脚本消息处理程序:

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

字符串
你可能只是得到“脚本错误.”消息,这是一个权限问题。(documentation)根据你的设置,这可以通过在你的首选项中添加权限来修复。Swift:

  1. webView.configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")

2fjabf4q

2fjabf4q4#

我发现的最好的解决方案是使用Safari的Web Inspector。有说明找到here
我一直遇到Script error.消息与陈云的解决方案(这是伟大的)没有可操作的内容。

相关问题