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 } } }