Communication
Receiving Messages
import SwiftUI
import WebKit
struct WebView: UIViewRepresentable {
// Define the specific UIView subclass we are representing
typealias UIViewType = WKWebView
let urlString: String
func makeUIView(context: Context) -> WKWebView {
// Configuration
let webViewConfiguration = WKWebViewConfiguration()
// ... shortened ...
let contentController = WKUserContentController()
// Register the message handler with the coordinator
contentController.add(context.coordinator, name: "MessageFromLiSA")
webViewConfiguration.userContentController = contentController
// Create WKWebView
// Use .zero frame; SwiftUI will manage the actual frame size
let webView = WKWebView(frame: .zero, configuration: webViewConfiguration)
// ... shortened ...
// Return the WKWebView directly
return webView
}
func updateUIView(_ webView: WKWebView, context: Context) {
// The `uiView` parameter *is* the WKWebView because we set UIViewType
// Check if the urlString prop has changed and reload if necessary
if let currentURL = webView.url?.absoluteString, currentURL == urlString {
// URL hasn't changed, do nothing
return
}
// URL string has changed, load the new one
if let url = URL(string: urlString) {
let request = URLRequest(url: url)
webView.load(request)
}
}
func makeCoordinator() -> Coordinator {
// Pass the WebView struct itself if needed
Coordinator(self)
}
// Coordinator
// Handles callbacks from the WKWebView
class Coordinator: NSObject, WKScriptMessageHandler, WKNavigationDelegate, WKUIDelegate {
// Reference back to the SwiftUI view
var parent: WebView
// Weak reference maybe better if lifecycle allows?
var webView: WKWebView?
init(_ parent: WebView) {
self.parent = parent
}
// WKScriptMessageHandler
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "MessageFromLiSA" {
// Handle message from JavaScript
print("Received message from LiSA: \(message.body)")
// You could trigger actions in your SwiftUI view here if needed,
// e.g., using @State variables passed down or Combine publishers.
}
}
}
}Sending Messages
Last updated