ContentView.swift
import SwiftUI struct ContentView: View { var body: some View { WebView(url: URL(string: "dummy")!) } }
WebView.swift
import SwiftUI import WebKit struct WebView: UIViewRepresentable { var url: URL func makeUIView(context: Context) -> WKWebView { let webConfig = WKWebViewConfiguration() let userController = WKUserContentController() userController.add(makeCoordinator(), name: "hoge") webConfig.userContentController = userController let wkWebView = WKWebView(frame: .zero, configuration: webConfig) return wkWebView } func updateUIView(_ uiView: WKWebView, context: Context) { // 普通にurlでブラウズするコード // let req = URLRequest(url: url) // uiView.load(req) // ローカルファイルindex.htmlを表示するコード // guard let path: String = Bundle.main.path(forResource: "index", ofType: "html") // else { return } // let localHTMLUrl = URL(fileURLWithPath: path, isDirectory: false) // uiView.loadFileURL(localHTMLUrl, allowingReadAccessTo: localHTMLUrl) let str = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>" + "<title>スマホでの見え方調整</title>" + "<meta name=\"viewport\" content=\"width=280\" />" + "</head>" + "<body>" + "<input type=\"button\" value=\"Exec\" onclick=\"var number = 123;" + "webkit.messageHandlers.hoge.postMessage(number);\" /><br />" + "<br />" + "</body>" + "</html>" uiView.loadHTMLString(str, baseURL: nil) } func makeCoordinator() -> WebView.Coordinator { return Coordinator() } } // struct extension WebView { class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler { func userContentController( _ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { if message.name == "hoge" { let number = message.body as! Int print("JavaScript is sending a number \(number)") } } } } struct WebView_Previews: PreviewProvider { static var previews: some View { WebView(url: URL(string: "dummy")!) } }