使用 JSContext 从 Swift 中的 JavaScript 捕获打印语句

Ant*_*ear 5 javascript javascriptcore swift

我正在尝试使用JSContext. 它运行良好,但我无法捕捉到console.log()语句。我怎样才能获得这些函数调用的结果,以便我也可以在 Swift 中打印它们?

示例代码

    let jsSource = "var testFunct = function(message) { console.log(\"kud\"); return \"Test Message: \" + message;}"

    let context = JSContext()
    context?.evaluateScript(jsSource)

    let testFunction = context?.objectForKeyedSubscript("testFunct")
    let result = testFunction?.call(withArguments: ["the message"])
    print(result!)
Run Code Online (Sandbox Code Playgroud)

日志示例

测试消息:消息

Ant*_*ear 5

如果有人遇到同样的问题,这里是 Swift 4 中的答案。

    let javascriptContext = JSContext()

    javascriptContext?.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
    let consoleLog: @convention(block) (String) -> Void = { message in
        print("console.log: " + message)
    }
    javascriptContext?.setObject(unsafeBitCast(consoleLog, to: AnyObject.self), forKeyedSubscript: "_consoleLog" as (NSCopying & NSObjectProtocol)!)
Run Code Online (Sandbox Code Playgroud)

现在您可以拨打console.log()任何后续evaluateScript电话javascriptContext