From 456fb72ae679114e3a750d16823b4e4808f4604c Mon Sep 17 00:00:00 2001 From: se2crid <151872490+se2crid@users.noreply.github.com> Date: Sat, 6 Dec 2025 16:27:56 +0100 Subject: [PATCH] feat: adds shortcut action Version 1.0.1 --- LocalDevVPN.xcodeproj/project.pbxproj | 8 +++-- LocalDevVPN/VPNShortcuts.swift | 43 +++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 LocalDevVPN/VPNShortcuts.swift diff --git a/LocalDevVPN.xcodeproj/project.pbxproj b/LocalDevVPN.xcodeproj/project.pbxproj index 98710e5..fecd826 100644 --- a/LocalDevVPN.xcodeproj/project.pbxproj +++ b/LocalDevVPN.xcodeproj/project.pbxproj @@ -420,6 +420,7 @@ DEVELOPMENT_TEAM = 42Q7QX86GV; ENABLE_PREVIEWS = YES; INFOPLIST_KEY_CFBundleDisplayName = LocalDevVPN; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; INFOPLIST_KEY_NSHumanReadableCopyright = "Coxson Engineering"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -430,7 +431,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.0; + MARKETING_VERSION = 1.0.1; PRODUCT_BUNDLE_IDENTIFIER = com.jkcoxson.LocalDevVPN; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -456,6 +457,7 @@ DEVELOPMENT_TEAM = 42Q7QX86GV; ENABLE_PREVIEWS = YES; INFOPLIST_KEY_CFBundleDisplayName = LocalDevVPN; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; INFOPLIST_KEY_NSHumanReadableCopyright = "Coxson Engineering"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -466,7 +468,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.0; + MARKETING_VERSION = 1.0.1; PRODUCT_BUNDLE_IDENTIFIER = com.jkcoxson.LocalDevVPN; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -490,6 +492,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = "$(TUNNEL_BUNDLE_IDENTIFIER)"; "PRODUCT_BUNDLE_IDENTIFIER[sdk=appletvos*]" = com.jkcoxson.LocalDevVPN.TunnelProv; "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.jkcoxson.LocalDevVPN.TunnelProv; @@ -515,6 +518,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = "$(TUNNEL_BUNDLE_IDENTIFIER)"; "PRODUCT_BUNDLE_IDENTIFIER[sdk=appletvos*]" = com.jkcoxson.LocalDevVPN.TunnelProv; "PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.jkcoxson.LocalDevVPN.TunnelProv; diff --git a/LocalDevVPN/VPNShortcuts.swift b/LocalDevVPN/VPNShortcuts.swift new file mode 100644 index 0000000..6236d77 --- /dev/null +++ b/LocalDevVPN/VPNShortcuts.swift @@ -0,0 +1,43 @@ +// +// VPNShortcuts.swift +// LocalDevVPN +// +// Created by se2crid on 7/12/2025. +// + +import Foundation +import NetworkExtension + +#if canImport(AppIntents) +import AppIntents + +@available(iOS 16.0, *) +struct StartLocalDevVPNIntent: AppIntent { + static var title: LocalizedStringResource = "Start LocalDevVPN" + static var description = IntentDescription("Connects LocalDevVPN without launching the app.") + + static var openAppWhenRun = false + + @MainActor + func perform() async throws -> some IntentResult { + TunnelManager.shared.startVPN() + return .result() + } +} + +@available(iOS 16.0, *) +struct LocalDevVPNActions: AppShortcutsProvider { + static var appShortcuts: [AppShortcut] { + AppShortcut( + intent: StartLocalDevVPNIntent(), + phrases: [ + "Start \(.applicationName)", + "Connect to \(.applicationName)", + "Enable \(.applicationName)" + ], + shortTitle: "Start VPN", + systemImageName: "lock.shield" + ) + } +} +#endif