从 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 函数

从 swift 4 调用贝宝 javascript 函数

将数据从 JavaScript 传递到 Swift。 UserContentController 函数从未调用过问题

如何从 WKWebView Swift 调用这个 javascript 函数?

如何在swift中从.js文件中调用javascript函数