You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:07:51