使用 Swift 开发移动应用程序时,我们经常会遇到需要在应用中嵌入网页内容的情况。而在这些嵌入的网页中,我们可能需要与 Swift 代码进行交互,从而实现更丰富的功能。在这种情况下,我们可以使用 WebView 来加载并展示网页内容,并通过 JavaScript 来调用 Swift 代码。
要实现从 JavaScript 正确调用 Swift 代码,我们需要进行一些必要的设置和处理。首先,我们需要将 WebView 的代理设置为当前视图控制器。这样,我们就能够接收来自 WebView 的回调和事件。然后,我们需要在 Swift 代码中注入一个 JavaScript 接口,以便 JavaScript 可以调用它。在注入 JavaScript 接口前,我们需要使用 WKUserScript 对象将 Swift 代码包装成 JavaScript 代码,并将其添加到 WebView 的配置中。这样,WebView 就能够识别并执行这段 JavaScript 代码。接下来,我们可以在 JavaScript 中使用 window.webkit.messageHandlers 对象来调用 Swift 代码。通过调用这个对象的 postMessage 方法,并传递一个包含所需参数的 JSON 对象,我们就能够实现从 JavaScript 到 Swift 的数据传递。下面是一个简单的示例代码,展示了如何从 JavaScript 调用 Swift 代码:swiftimport UIKitimport WebKitclass ViewController: UIViewController, WKScriptMessageHandler { var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() let configuration = WKWebViewConfiguration() let userContentController = WKUserContentController() userContentController.add(self, name: "callbackHandler") configuration.userContentController = userContentController webView = WKWebView(frame: view.bounds, configuration: configuration) view.addSubview(webView) if let url = URL(string: "https://example.com") { let request = URLRequest(url: url) webView.load(request) } } func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { if message.name == "callbackHandler", let body = message.body as? [String: Any] { if let action = body["action"] as? String { if action == "showAlert" { showAlert() } } } } func showAlert() { let alert = UIAlertController(title: "Hello", message: "This is a Swift alert", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alert, animated: true, completion: nil) }}在上述代码中,我们首先创建了一个 WKWebView,并将其添加到当前视图控制器的视图层级中。然后,我们使用 WKWebViewConfiguration 创建了一个 WebView 的配置对象,并将一个遵循 WKScriptMessageHandler 协议的对象添加到其 UserContentController 中。在这个示例中,我们将当前视图控制器自身作为这个对象。然后,我们设置了 WebView 的代理为当前视图控制器,并加载了一个 URL。在 userContentController 的回调方法中,我们通过判断 message 的 name 和 body,来处理 JavaScript 发送过来的消息。在这个示例中,我们判断了 action 字段的值是否为 "showAlert",如果是的话,就调用了 showAlert 方法显示一个弹窗。通过上述示例,我们可以看到如何从 JavaScript 正确调用 Swift 代码。在实际应用中,我们可以根据自己的需求,通过修改和扩展上述示例,实现更复杂的交互功能。