0

The goal is to invoke a callback function inside a web page contained inside a WKWebView.

evaluateJavaScript breaks when its parameter contains the newline character, meaning the callback function never gets called.

Why is this?

userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) is invoked when the user presses a button on the web page.

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    let dict = message.body as! [String:AnyObject]
    let callback = dict["callback"] as! String

    // Fails
    let serializedClipboard = "hello\n" 

    // Works
    // let serializedClipboard = "hello" 

    webView!.evaluateJavaScript("\(callback)('\(serializedClipboard)')") { (object: Any?, error: Error?) -> Void in
        print("Done invoking \(callback)")
    }
}
Crashalot
  • 31,452
  • 56
  • 235
  • 393
  • Now that the question has been reformulated, it seems like a matter of escaping the newline inside of `evaluateJavaScript` ... one option is to encode to base64 (then decode on the JavaScript side), but is there a cleaner way to pass through newline characters? – Crashalot Oct 27 '16 at 19:37
  • why would you want to pass a new line in a callback parameter? – Vladimir M Oct 27 '16 at 19:41
  • @VladimirM if you're serializing a paragraph of text, for instance. – Crashalot Oct 27 '16 at 19:43
  • Ah, you actually want to escape the \n. [how to handle new-lines in JSON](http://stackoverflow.com/questions/42068/how-do-i-handle-newlines-in-json) people seem to agree with your approach. – Vladimir M Oct 27 '16 at 19:52

1 Answers1

2

One option that seems to be working is to escape newline characters inside the parameter:

let escapedClipboard = serializedClipboard.stringByReplacingOccurrencesOfString("\n", withString: "\\n")

Please post suggestions if you see a cleaner solution.

Crashalot
  • 31,452
  • 56
  • 235
  • 393