Adds URL scheme

Adds the ability to start and stop the VPN connection via a custom URL scheme.
This commit is contained in:
se2crid
2025-12-18 16:24:39 +01:00
parent 56101e551f
commit 90cce22ab9
2 changed files with 43 additions and 0 deletions

View File

@@ -2,6 +2,17 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.localdevvpn</string>
<key>CFBundleURLSchemes</key>
<array>
<string>localdevvpn</string>
</array>
</dict>
</array>
<key>NSBonjourServices</key>
<array>
<string>_apple-mobdev2._tcp</string>

View File

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