iOS:当参数包含换行符时,evaluateJavaScript 不会调用函数
Posted
技术标签:
【中文标题】iOS:当参数包含换行符时,evaluateJavaScript 不会调用函数【英文标题】:iOS: evaluateJavaScript will not invoke function when parameter contains newline character 【发布时间】:2016-10-27 19:05:08 【问题描述】:目标是在 WKWebView
中包含的网页内调用回调函数。
evaluatejavascript
在其参数包含换行符时中断,这意味着永远不会调用回调函数。
这是为什么?
userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
在用户按下网页上的按钮时被调用。
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)")
【问题讨论】:
现在问题已经被重新表述,似乎是在evaluateJavaScript
中转义换行符...一种选择是编码为base64(然后在JavaScript 端解码),但是有没有更简洁的方法来传递换行符?
为什么要在回调参数中传递新行?
@VladimirM 例如,如果您正在序列化一段文本。
啊,你其实是想逃避\n。 how to handle new-lines in JSON 人们似乎同意你的做法。
【参考方案1】:
似乎可行的一个选项是在参数中转义换行符:
let escapedClipboard = serializedClipboard.stringByReplacingOccurrencesOfString("\n", withString: "\\n")
如果您看到更清洁的解决方案,请发表建议。
【讨论】:
这样做的一个大问题是并非所有换行符都是\n
。以上是关于iOS:当参数包含换行符时,evaluateJavaScript 不会调用函数的主要内容,如果未能解决你的问题,请参考以下文章
向 iOS 设备发送数据消息会导致 FirebaseMessagingException:请求包含无效参数