使用 JSContext 从 Swift 中的 JavaScript 捕获打印语句
Catching print statement from JavaScript in Swift using JSContext
我正在尝试使用 JSContext
在我的 iOS 应用程序中评估一些 JavaScript。它运行良好,但我无法捕获 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!)
示例日志
Test Message: the message
如果有人遇到同样的问题,请参阅 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)!)
现在您可以在任何后续 evaluateScript
调用中调用 console.log()
javascriptContext
。
我正在尝试使用 JSContext
在我的 iOS 应用程序中评估一些 JavaScript。它运行良好,但我无法捕获 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!)
示例日志
Test Message: the message
如果有人遇到同样的问题,请参阅 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)!)
现在您可以在任何后续 evaluateScript
调用中调用 console.log()
javascriptContext
。