Здесь возможен подход. Поскольку у меня нет предполагаемой среды тестирования, я не смог полностью ее протестировать, но вся инфраструктура построена правильно. Так что вы можете попробовать
struct WebView: UIViewRepresentable {
let request: URLRequest
func makeUIView(context: Context) -> WKWebView {
let webConfiguration = WKWebViewConfiguration()
let wkcontentController = WKUserContentController()
wkcontentController.add(context.coordinator, name: "test")
webConfiguration.userContentController = wkcontentController
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
context.coordinator.parent = webView // inject as weak
return webView
}
func updateUIView(_ view: WKWebView, context: Context) {
if view.url == nil {
view.load(request)
}
}
func makeCoordinator() -> ContentController {
ContentController() // let handler be a coordinator
}
class ContentController: NSObject, WKScriptMessageHandler {
weak var parent: WKWebView? // weak to avoid reference cycling
func userContentController(_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage) {
if message.name == "test" {
print(message.body)
parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'red'",
completionHandler: nil)
}
}
}
}