From 90cce22ab9074a59a59ef2975e5999254e07ebf2 Mon Sep 17 00:00:00 2001 From: se2crid <151872490+se2crid@users.noreply.github.com> Date: Thu, 18 Dec 2025 16:24:39 +0100 Subject: [PATCH] Adds URL scheme Adds the ability to start and stop the VPN connection via a custom URL scheme. --- LocalDevVPN/Info.plist | 11 +++++++++++ LocalDevVPN/StosVPNApp.swift | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/LocalDevVPN/Info.plist b/LocalDevVPN/Info.plist index 4f62b60..dd24e8d 100644 --- a/LocalDevVPN/Info.plist +++ b/LocalDevVPN/Info.plist @@ -2,6 +2,17 @@ + CFBundleURLTypes + + + CFBundleURLName + com.localdevvpn + CFBundleURLSchemes + + localdevvpn + + + NSBonjourServices _apple-mobdev2._tcp diff --git a/LocalDevVPN/StosVPNApp.swift b/LocalDevVPN/StosVPNApp.swift index 31d1986..732746d 100644 --- a/LocalDevVPN/StosVPNApp.swift +++ b/LocalDevVPN/StosVPNApp.swift @@ -12,6 +12,38 @@ struct LocalDevVPNApp: App { var body: some Scene { WindowGroup { ContentView() + .onOpenURL { url in + handleURL(url) + } + } + } + + private func handleURL(_ url: URL) { + guard url.scheme == "localdevvpn" else { return } + + let tunnelManager = TunnelManager.shared + + switch url.host { + case "enable": + tunnelManager.startVPN() + if let components = URLComponents(url: url, resolvingAgainstBaseURL: false), + let schemeParam = components.queryItems?.first(where: { $0.name == "scheme" })?.value { + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + let callbackURL = URL(string: "\(schemeParam)://")! + UIApplication.shared.open(callbackURL) + } + } + case "disable": + tunnelManager.stopVPN() + if let components = URLComponents(url: url, resolvingAgainstBaseURL: false), + let schemeParam = components.queryItems?.first(where: { $0.name == "scheme" })?.value { + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + let callbackURL = URL(string: "\(schemeParam)://")! + UIApplication.shared.open(callbackURL) + } + } + default: + break } } }