// inject JS to capture console.log output and send to iOS
let source = "function captureLog(msg) { window.webkit.messageHandlers.logHandler.postMessage(msg); } window.console.log = captureLog;"
let script = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
webView.configuration.userContentController.addUserScript(script)
// register the bridge script that listens for the output
webView.configuration.userContentController.add(self, name: "logHandler")
下面是Richard的答案的一个调整(好吧,有几个答案使用相同的方法),它处理console.log的字符串替换。 我之所以需要这个,是因为React错误是用像Hey you had an error:%s这样的字符串记录的,当然我需要看看%s是什么,我还使用了.documentStart,因为我想立即捕获错误。 将WKUserScript添加到WKUserContentController(它是用于初始化WKWebView的WKWebViewConfiguration的一部分):
let source = """
function sprintf(str, ...args) { return args.reduce((_str, val) => _str.replace(/%s|%v|%d|%f|%d/, val), str); }
function captureLog(str, ...args) { var msg = sprintf(str, ...args); window.webkit.messageHandlers.logHandler.postMessage({ msg, level: 'log' }); }
function captureWarn(str, ...args) { var msg = sprintf(str, ...args); window.webkit.messageHandlers.logHandler.postMessage({ msg, level: 'warn' }); }
function captureError(str, ...args) { var msg = sprintf(str, ...args); window.webkit.messageHandlers.logHandler.postMessage({ msg, level: 'error' }); }
window.console.error = captureError; window.console.warn = captureWarn;
window.console.log = captureLog; window.console.debug = captureLog; window.console.info = captureLog;
"""
let script = WKUserScript(source: source, injectionTime: .atDocumentStart, forMainFrameOnly: false)
let config = WKWebViewConfiguration.init()
let userContentController = WKUserContentController()
config.userContentController = userContentController
userContentController.addUserScript(script)
// ... potentially somewhere else ...
let webView = WKWebView(frame: CGRect.zero, configuration: config)
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
{
print("message: \(message.body)")
// and whatever other actions you want to take
}
9条答案
按热度按时间drnojrws1#
可以将Mac上的Safari浏览器连接到WKWebView并访问控制台。
在Safari中,打开“开发”选项卡,当iOS模拟器在WKWebView打开的情况下运行时,只需单击它即可打开控制台。
vulvrdjw2#
这对我很有效**(Swift 4.2/5)**:
然后,按照WKScriptMessageHandler协议,使用以下内容拾取重定向的控制台消息:
7eumitmz3#
我需要一种在Xcode的控制台中查看JavaScript日志的方法,根据noxo的回答,我得出了以下结论:
它有一些改进:
log
、warn
、error
和debug
进行报告console.log
的所有参数,而不仅仅是第一个参数1l5u6lss4#
您可以重新评估(覆盖)Javascript console. log()默认实现,使用window. webkit. messageHandlers. postMessage(msg)来转发消息,然后使用WKScriptMessageHandler::didReceiveScriptMessage在本机代码处拦截javascript postMessage(msg)调用,以获取记录的消息。
步骤1)重新评估console.log默认实现以使用postMessage()
步骤2)在WKScriptMessageHandler::didReceiveScriptMessage处拦截本机代码中的javascript postMessage
ergxz8rk5#
下面是Richard的答案的一个调整(好吧,有几个答案使用相同的方法),它处理
console.log
的字符串替换。我之所以需要这个,是因为React错误是用像
Hey you had an error:%s
这样的字符串记录的,当然我需要看看%s
是什么,我还使用了.documentStart
,因为我想立即捕获错误。将
WKUserScript
添加到WKUserContentController
(它是用于初始化WKWebView
的WKWebViewConfiguration
的一部分):...并在任何类中处理它(提示:必须是
NSObject
),您在其中实现了WKScriptMessageHandler
:将
NSLog
替换为您实际使用的任何内容(例如,您的自定义Swift日志处理程序函数)。h9a6wy2h6#
通常,控制台日志记录在js中定义为
我的答案改编自handling-javascript-events-in-wkwebview!
使用配置初始化WKWebView
或者使用KVO观察属性“estimatedProgress”并通过evalueJavaScript注入js
实现WKScriptMessageHandler协议接收消息:
qf9go6mv7#
这个页面上的一些很好的解决方案可能会神秘地崩溃你的页面。我发现这是因为一些对象(例如事件)导致JSON.stringify抛出一个exeception(例如参见How to stringify event object?)
为了简单起见,我捕获了异常并继续下一步,在此过程中,我将逻辑封装到一个类中,这样userContentController对象的使用就变成了一行代码:
实现的源代码如下。我的注入脚本比这里的一些简单,对于我的目的,我不想听到警告/错误等,所以我可以专注于日志,我不想看到任何表情符号,但除此之外,这和苏霍姆的答案很相似这是一个练习,可以使用这些选项使类更易于配置,或者巧妙地处理有问题的对象,以便至少在部分。
}
izkcnapc8#
Swift 4.2和5
i7uq4tfw9#
请使用这个漂亮的应用程序内"Bridge"
编辑:
然后,您可以使用delegate方法: