gpt4 book ai didi

javascript - 获取来自 WKWebView 的 JavaScript 错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:29 25 4
gpt4 key购买 nike

我实现了 WKScriptMessageHandler 协议(protocol)并且定义了 userContentController(:didReceiveScriptMessage:) 方法。

当 Javascript 出现错误时,我(在 WKScriptMessage 对象中)得到了一些不太有用的东西,比如:

{
col = 0;
file = "";
line = 0;
message = "Script error.";
type = error;
}

另一方面,如果我打开 Safari Web Inspector,我可以看到真正的错误(例如):

类型错误:FW.Ui.Modal.sho 不是函数。 (在'FW.Ui.Modal.sho'中,'FW.Ui.Modal.sho'是未定义的)

有没有办法在我的 native 代码中恢复该错误?

编辑:澄清一下,javascript 代码是由 javascript 开发人员编写的(他无法访问 native 源代码,因此他无法通过 Xcode 调试应用程序)。然后将他编写的代码推送到 iOS 应用(从企业应用商店下载)。

最佳答案

您可以在计算表达式之前将表达式包装在 try catch block 中。然后让 JavaScript 在失败时返回错误消息。这是取自 Turbolinks-iOS adapter 的示例,在 GitHub 上可用。

extension WKWebView {
func callJavaScriptFunction(functionExpression: String, withArguments arguments: [AnyObject?] = [], completionHandler: ((AnyObject?) -> ())? = nil) {
guard let script = scriptForCallingJavaScriptFunction(functionExpression, withArguments: arguments) else {
NSLog("Error encoding arguments for JavaScript function `%@'", functionExpression)
return
}

evaluateJavaScript(script) { (result, error) in
if let result = result as? [String: AnyObject] {
if let error = result["error"] as? String, stack = result["stack"] as? String {
NSLog("Error evaluating JavaScript function `%@': %@\n%@", functionExpression, error, stack)
} else {
completionHandler?(result["value"])
}
} else if let error = error {
self.delegate?.webView(self, didFailJavaScriptEvaluationWithError: error)
}
}
}

private func scriptForCallingJavaScriptFunction(functionExpression: String, withArguments arguments: [AnyObject?]) -> String? {
guard let encodedArguments = encodeJavaScriptArguments(arguments) else { return nil }

return
"(function(result) {\n" +
" try {\n" +
" result.value = " + functionExpression + "(" + encodedArguments + ")\n" +
" } catch (error) {\n" +
" result.error = error.toString()\n" +
" result.stack = error.stack\n" +
" }\n" +
" return result\n" +
"})({})"
}

private func encodeJavaScriptArguments(arguments: [AnyObject?]) -> String? {
let arguments = arguments.map { $0 == nil ? NSNull() : $0! }

if let data = try? NSJSONSerialization.dataWithJSONObject(arguments, options: []),
string = NSString(data: data, encoding: NSUTF8StringEncoding) as? String {
return string[string.startIndex.successor() ..< string.endIndex.predecessor()]
}

return nil
}
}

关于javascript - 获取来自 WKWebView 的 JavaScript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37564714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com