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:请求包含无效参数

检测换行符以在 iOS 上的 UITextView 上自动输入换行文本

IO流知识盲点

ruby puts, print, p方法比较

C++ 解析文件的最快方法

在 MySQL 中导出包含换行符的列的表