javascript - 我如何从 JS 到 Swift 通信

标签 javascript ios swift webview wkwebview

我正在创建一个混合应用程序,我正在尝试弄清楚如何将一些数据从 WKWebView 传递到 native 应用程序。

几天来我一直在努力解决这个问题,但我似乎找不到任何东西!网上关于此的信息似乎很少,而我找到的所有信息都是相反的(Swift 到 JS,而不是 JS 到 Swift)。

我试过使用 URL 变量,但 Webview 必须重新加载 Swift 才能识别它已更改。我尝试使用 WKScriptMessageHandler ,但我找不到任何关于它的好文档,而且它看起来很复杂。

一定有一些简单的方法可以做到这一点。 有什么想法吗?

如果有人能帮我解决这个问题,我将不胜感激。

最佳答案

其实并没有那么复杂。

首先,您必须将脚本消息处理程序添加到内容 Controller 中。

let contentController = WKUserContentController()
contentController.add(self, name: "derp") //name is the key you want the app to listen to.

接下来,您必须将内容 Controller 分配到配置中。

let config = WKWebViewConfiguration()
config.userContentController = contentController

然后您需要将配置分配给您的 WebView 。

let webView = WKWebView(frame: CGRect.zero, configuration: config) //set your own frame

以及 JS 方面。

var message = {'fruit':'apple'};
window.webkit.messageHandlers.derp.postMessage(message);

最后,您必须让您的 View Controller (我假设 webView 在 View Controller 中)符合 WKScriptMessageHandler 协议(protocol)。我已按照要求将其余代码添加到示例 View Controller 中。

class MyViewController: UIViewController, WKScriptMessageHandler {

    override func viewDidLoad() {

        super.viewDidLoad()

        let contentController = WKUserContentController()
        contentController.add(self, name: "derp")

        let config = WKWebViewConfiguration()
        config.userContentController = contentController

        let webView = WKWebView(frame: self.view.frame, configuration: config) //you can consider using auto layout though
        self.view.addSubview(webView)

        //load your url here 
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {

        //handle script messages here
        //message.name is "derp"
        //message.body is ["fruit":"apple"]
    }
}

关于javascript - 我如何从 JS 到 Swift 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47860622/

相关文章:

ios - AudioServicesPlaySystemSound 的系统声音是什么?

ios - 如何在 iOS 中打开和查看 .xlsx 文件

swift - Cocoa tableview 复选框状态在滚动时丢失

ios - 删除部分的最后一行会导致崩溃

javascript - 防止在 IOS 和 Android 中拖动页面滚动

ios - 尝试将日期选择器时间与当前时间ios进行比较

javascript - 如何控制元素不出现错误?

swift - 从 PhysicsBody 移除弹跳?

javascript - jQuery 与 native 原型(prototype)冲突

javascript - Ajax 不返回数据