从 swift 评估 javascript 函数,在完成处理程序中得到 nil
Posted
技术标签:
【中文标题】从 swift 评估 javascript 函数,在完成处理程序中得到 nil【英文标题】:Evaluating javascript function from swift, getting nil in the completion handler 【发布时间】:2018-02-14 08:53:23 【问题描述】:在我的 ios 应用程序中,我正在 WKWebView 中加载一个 url,然后在原生 iOS 按钮上单击我正在调用一个 javascript 函数来执行。我正在使用以下方法来执行该功能。
let result = webView.evaluateJavaScript("saveUserTemplate()", completionHandler: (response, error) in
print(response as Any)
print(error as Any)
)
现在,问题是,当完成处理程序被触发时,我得到的响应和错误都是 nil。
请提出一些从 java 脚本函数获取响应的方法。
【问题讨论】:
javascript函数在哪里? 函数在我的服务器端 尝试删除所有代码并从该函数发送硬编码响应,以查看服务器端是否按预期工作。 @Mr.Bista,仍然没有回应。该值是从该方法中的 ajax 函数返回的。这是它从 ajax 方法返回的方式的问题吗? 【参考方案1】:我没有从 evaluateJavaScript 函数得到响应,因为服务器端的 ajax 调用并且 javascript 函数没有等待 ajax 调用的执行完成。
使用 wkWebview 的脚本消息解决了这个问题。
我为 webview 创建了配置,并在配置中添加了 contentController。
let contentController = WKUserContentController()
contentController.add(self, name: "cardSaved")
let config = WKWebViewConfiguration()
config.userContentController = contentController
webView = WKWebView(frame: CGRect(x: 10 , y : 10, width : UIScreen.main.bounds.width - 20, height : view.bounds.height - 150), configuration : config)
处理程序是从 javascript 函数中触发的,例如:
webkit.messageHandlers.cardSaved.postMessage("Card Saved Succesfully");
一旦从 javascript 端触发事件,我的委托方法就会被触发:
//MARK: - WKScriptMessageHandler Methods
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
if message.name == "cardSaved"
print(message.body)
【讨论】:
以上是关于从 swift 评估 javascript 函数,在完成处理程序中得到 nil的主要内容,如果未能解决你的问题,请参考以下文章
swift 笔记:iOS与JavaScript的交互(一):UIWebView - 2.1直接使用字符串通过评估Java脚本(来自:)
从使用 wkwebview 返回值的 javascript 调用 swift 函数
将数据从 JavaScript 传递到 Swift。 UserContentController 函数从未调用过问题