Crashalot
Crashalot

Reputation: 34503

iOS: evaluateJavaScript will not invoke function when parameter contains newline character

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

Upvotes: 1

Views: 2052

Answers (1)

Crashalot
Crashalot

Reputation: 34503

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.

Upvotes: 2

Related Questions