ios - WKWebView 获取 Javascript 错误
问题描述
有没有办法从 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
不是我要找的!有什么办法可以进入我的应用程序,出现上述错误?非常感谢!
解决方案
为了处理错误,我们将向加载到页面中的 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
.
推荐阅读
- angular - 如何检测同一组件中从一个输入到另一个输入的变化
- regex - 用正则表达式分别计算每个数字?
- javascript - 按钮图片展示
- css - 在所有 CSS 之后每个分辨率使用一个媒体屏幕更好,还是在 CSS 的每个部分之后有单独的媒体屏幕更好?
- json - Alamofire 5.*:使用 jsonDecodable 解码和处理错误解析的 json 验证响应
- python - 熊猫。如何在飞蛾的最后一天重新取样?
- rust - 围绕异步和流的生命周期
- python - 使用 python-docx 将整页图像添加到 docx
- opencl - `clCreateBuffer`中`host_ptr`参数的作用是什么
- javascript - Three.js 代码中的对象始终呈现在另一个之上