Пробовал исправить Лесли Годвина, но получал эту ошибку:
'objectForKeyedSubscript' is unavailable: use subscripting
Для Swift 2.2 вот что сработало для меня:
Вам нужно будет импортировать JavaScriptCore для этого кода для компиляции:
import JavaScriptCore
if let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") {
context.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
let consoleLog: @convention(block) String -> Void = { message in
print("javascript_log: " + message)
}
context.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog")
}
Затем в вашем JavaScript-коде вызов console.log ("_ your_log_") будет печататься в консоли Xcode.
Еще лучше, добавить этот код в качестве расширения UIWebView:
import JavaScriptCore
extension UIWebView {
public func hijackConsoleLog() {
if let context = valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") {
context.evaluateScript("var console = { log: function(message) { _consoleLog(message) } }")
let consoleLog: @convention(block) String -> Void = { message in
print("javascript_log: " + message)
}
context.setObject(unsafeBitCast(consoleLog, AnyObject.self), forKeyedSubscript: "_consoleLog")
}
}
}
А затем вызовите этот метод на этапе инициализации UIWebView:
let webView = UIWebView(frame: CGRectZero)
webView.hijackConsoleLog()