SwiftUIでコード内の文字をWebKitで表示してjavascriptの結果を受け取る
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")!)
}
}