import UIKit import SwiftUI import WebKit class SceneDelegate: UIResponder, UIWindowSceneDelegate, WKScriptMessageHandler { func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { print(message.body) } var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). let preferences = WKPreferences() preferences.javaScriptEnabled = true configuration = WKWebViewConfiguration() configuration.preferences = preferences configuration.userContentController = WKUserContentController() // 给webview与swift交互起一个名字:AppModel,webview给swift发消息的时候会用到 configuration.userContentController.add(self, name: "AppModel") // Create the SwiftUI view that provides the window contents. let contentView = ContentView() // Use a UIHostingController as window root view controller. if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) window.rootViewController = UIHostingController(rootView: contentView) self.window = window window.makeKeyAndVisible() } } func sceneDidDisconnect(_ scene: UIScene) { // Called as the scene is being released by the system. // This occurs shortly after the scene enters the background, or when its session is discarded. // Release any resources associated with this scene that can be re-created the next time the scene connects. // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). } func sceneDidBecomeActive(_ scene: UIScene) { // Called when the scene has moved from an inactive state to an active state. // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. } func sceneWillResignActive(_ scene: UIScene) { // Called when the scene will move from an active state to an inactive state. // This may occur due to temporary interruptions (ex. an incoming phone call). } func sceneWillEnterForeground(_ scene: UIScene) { // Called as the scene transitions from the background to the foreground. // Use this method to undo the changes made on entering the background. } func sceneDidEnterBackground(_ scene: UIScene) { // Called as the scene transitions from the foreground to the background. // Use this method to save data, release shared resources, and store enough scene-specific state information // to restore the scene back to its current state. } } var configuration = WKWebViewConfiguration()
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>SVH Map Demo</title> </head> <body> <!--SVG Data Start--> <svg width="302px" height="302px" viewBox="0 0 302 302" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title>Map</title> <g id="SVG-Map" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="画板" transform="translate(-29.000000, -29.000000)"> <g id="Map" transform="translate(29.000000, 29.000000)"> <rect id="Background" fill="#FFFFFF" x="0" y="0" width="302" height="302"></rect> <line x1="51" y1="150.5" x2="251" y2="150.5" id="Line01" stroke="#2A6EBB" stroke-width="9" stroke-linecap="round"></line> <line x1="151.849648" y1="51" x2="151.150352" y2="250.998777" id="Line02" stroke="#F09438" stroke-width="9" stroke-linecap="round"></line> <circle id="L1_Point1" stroke="#428BDD" stroke-width="5" fill="#FFFFFF" cx="51" cy="151" r="6.5"></circle> <circle id="L1_Point2" stroke="#428BDD" stroke-width="5" fill="#FFFFFF" cx="118" cy="151" r="6.5"></circle> <circle id="L1_Point3" stroke="#428BDD" stroke-width="5" fill="#FFFFFF" cx="184" cy="151" r="6.5"></circle> <circle id="L1_Point4" stroke="#428BDD" stroke-width="5" fill="#FFFFFF" cx="251" cy="151" r="6.5"></circle> <circle id="L2_Point1" stroke="#F4B373" stroke-width="5" fill="#FFFFFF" transform="translate(151.000000, 51.000000) rotate(-270.000000) translate(-151.000000, -51.000000) " cx="151" cy="51" r="6.5"></circle> <circle id="L2_Point2" stroke="#F4B373" stroke-width="5" fill="#FFFFFF" transform="translate(151.000000, 118.000000) rotate(-270.000000) translate(-151.000000, -118.000000) " cx="151" cy="118" r="6.5"></circle> <circle id="L2_Point3" stroke="#F4B373" stroke-width="5" fill="#FFFFFF" transform="translate(151.000000, 184.000000) rotate(-270.000000) translate(-151.000000, -184.000000) " cx="151" cy="184" r="6.5"></circle> <circle id="L2_Point4" stroke="#F4B373" stroke-width="5" fill="#FFFFFF" transform="translate(151.000000, 251.000000) rotate(-270.000000) translate(-151.000000, -251.000000) " cx="151" cy="251" r="6.5"></circle> </g> </g> </g> </svg> <!--SVG Data End--> <!--JS Action--> <script> //Line1 var L1_Point01 = document.getElementById('L1_Point1'); var L1_Point02 = document.getElementById('L1_Point2'); var L1_Point03 = document.getElementById('L1_Point3'); var L1_Point04 = document.getElementById('L1_Point4'); //Line2 var L2_Point01 = document.getElementById('L2_Point1'); var L2_Point02 = document.getElementById('L2_Point2'); var L2_Point03 = document.getElementById('L2_Point3'); var L2_Point04 = document.getElementById('L2_Point4'); //Action function ClickPoint(pointname){ window.webkit.messageHandlers.AppModel.postMessage("WebView点击,发送消息给Swift!" + pointname); } L1_Point01.onclick = function(){ClickPoint(1);} L1_Point02.onclick = function(){ClickPoint(2);} L1_Point03.onclick = function(){ClickPoint(3);} L1_Point04.onclick = function(){ClickPoint(4);} L2_Point01.onclick = function(){ClickPoint(5);} L2_Point02.onclick = function(){ClickPoint(6);} L2_Point03.onclick = function(){ClickPoint(7);} L2_Point04.onclick = function(){ClickPoint(8);} </script> </body> </html>