【问题标题】:WKWebView get Javascript ErrorsWKWebView 获取 Javascript 错误
【发布时间】:2018-05-08 09:06:55
【问题描述】:

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

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

【问题讨论】:

  • 可以分享一下网址吗?所以我们也可以调试一下
  • @iMHitesh 它的本地主机,我自己产生了错误,所以我可以在 xcode 打印上得到它例如:)

标签: ios swift uiwebview wkwebview


【解决方案1】:

为了处理错误,我们将在加载到页面的 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 的其他消息的 switch 语句中。

【讨论】:

  • 要接受这个确定的答案作为正确的答案。我已经以这种特定方式处理错误消息了!而且 mosdef 我也应该用我做的方式更新我的问题。谢谢山姆!
  • 在 iOS (12, 13) 上为我工作以在 Xcode 日志中获取 JS 错误。如解决方案中所述,我必须使用“localhost”。另外,使用WKWebViewinitWithFrame:configuration: Plus 1。
【解决方案2】:

试试下面的方法。

首先,注入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")

【讨论】:

【解决方案3】:

在 JavaScript 中,挂钩窗口 onerror 事件以回调您的脚本消息处理程序:

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

您可能只会收到“脚本错误”。消息,这是一个权限问题。 (documentation) 根据您的设置,可以通过向您的首选项添加权限来解决此问题。 斯威夫特:

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

【讨论】:

  • allowFileAccessFromFileURLs 是私有财产
【解决方案4】:

我发现的最佳解决方案是使用 Safari 的 Web Inspector。找到了here的说明。

我不断遇到Script error. 使用 Yun CHEN 的解决方案(非常棒)的消息,但没有可操作的内容。

【讨论】:

  • 您需要确保您的基本 URL 是 localhost 才能修复 "Script error.",请参阅我的答案了解更多详情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多