Javascript console.log() in an iOS UIWebView

前端 未结 7 1015
深忆病人
深忆病人 2020-11-28 01:10

When writing a iPhone / iPad app with a UIWebView, the console isn\'t visible. this excellent answer shows how to trap errors, but I would like to use the console.log() as w

7条回答
  •  悲&欢浪女
    2020-11-28 02:01

    Tried Leslie Godwin's fix but was getting this error:

    'objectForKeyedSubscript' is unavailable: use subscripting
    

    For Swift 2.2, here's what worked for me:

    You will need to import JavaScriptCore for this code to compile:

    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")
    }
    

    Then in your javascript code, calling console.log("_your_log_") will print in Xcode console.

    Better yet, add this code as an extension to 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")
            }
        }
    }
    

    And then call this method during your UIWebView initialization step:

    let webView = UIWebView(frame: CGRectZero)
    webView.hijackConsoleLog()
    

提交回复
热议问题