如何在Swift中通过JSContext捕获JavaScript的console.log输出?
解决JSContext中无法捕获console.log输出的问题
这个问题很常见——默认情况下JSContext并不会把JavaScript里的console.log调用转发到Swift的控制台,我们只需要手动给JS环境里的console对象绑定一个自定义的log方法,就能把JS的输出同步到Swift中了。
具体实现思路
核心逻辑是:把Swift的打印逻辑包装成闭包,注入到JS环境的console.log方法上,这样每当JS代码调用console.log时,就会触发我们的Swift闭包,从而捕获并输出内容。
修改后的完整示例代码
let jsSource = """ var testFunct = function(message) { console.log("kud"); return "Test Message: " + message; } """ let context = JSContext() // 关键步骤:给JS的console.log绑定Swift闭包 context?.objectForKeyedSubscript("console").setObject( { (arguments: [Any]) in // 将JS传入的参数拼接成可读字符串 let logContent = arguments.map { "\($0)" }.joined(separator: " ") print("[JS Console] \(logContent)") }, forKeyedSubscript: "log" as NSString ) // 执行JS代码并调用目标函数 context?.evaluateScript(jsSource) let testFunction = context?.objectForKeyedSubscript("testFunct") let result = testFunction?.call(withArguments: ["the message"]) print(result!)
运行后的控制台输出
执行这段代码后,你会在Swift控制台看到两条打印内容:
[JS Console] kud
Test Message: the message
额外扩展说明
- 用同样的方式,你还可以处理
console.error、console.warn等其他控制台方法,只需要给对应的key绑定不同的闭包即可(比如给error添加红色标识,或者单独收集错误日志)。 - 如果JS环境原本不存在
console对象,上述代码会自动创建它,无需担心报错。
内容的提问来源于stack exchange,提问作者Anters Bear
相关产品推荐
相关产品推荐

