88 votes

Javascript console.log() dans un UIWebView iOS

Lorsque l'on écrit une application iPhone / iPad avec un UIWebView, la console n'est pas visible. cette excellente réponse montre comment piéger les erreurs, mais j'aimerais aussi utiliser la fonction console.log().

1 votes

Écrivez-le d'abord dans le navigateur, activez les outils de développement, puis regardez la sortie de la console.

1voto

Barath Points 661

Swift 5

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
      webView.evaluateJavaScript("your javascript string") { (value, error) in
          if let errorMessage = (error! as NSError).userInfo["WKJavaScriptExceptionMessage"] as? String {
                print(errorMessage)
          }
      }
 }

0voto

parag Points 639

J'ai essayé la solution de Leslie Godwin mais j'ai eu cette erreur :

'objectForKeyedSubscript' is unavailable: use subscripting

Pour Swift 2.2, voici ce qui a fonctionné pour moi :

Vous devrez importer JavaScriptCore pour que ce code soit compilé :

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

Ensuite, dans votre code javascript, appeler console.log("_votre_log_") imprimera dans la console Xcode.

Mieux encore, ajoutez ce code comme une extension de 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")
        }
    }
}

Et ensuite, appelez cette méthode pendant l'étape d'initialisation de votre UIWebView :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X