Initial rebrand
@@ -1,13 +1,36 @@
|
|||||||
{
|
{
|
||||||
"fill" : {
|
"fill" : {
|
||||||
"automatic-gradient" : "display-p3:0.23889,0.54053,0.96826,1.00000"
|
"linear-gradient" : [
|
||||||
|
"display-p3:0.72718,1.00000,0.56150,1.00000",
|
||||||
|
"display-p3:0.23889,0.54053,0.96826,1.00000"
|
||||||
|
],
|
||||||
|
"orientation" : {
|
||||||
|
"start" : {
|
||||||
|
"x" : 0.5,
|
||||||
|
"y" : 0
|
||||||
|
},
|
||||||
|
"stop" : {
|
||||||
|
"x" : 0.5,
|
||||||
|
"y" : 0.7
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"groups" : [
|
"groups" : [
|
||||||
{
|
{
|
||||||
"layers" : [
|
"layers" : [
|
||||||
{
|
{
|
||||||
|
"blend-mode" : "normal",
|
||||||
|
"hidden" : false,
|
||||||
"image-name" : "StosPlug.svg",
|
"image-name" : "StosPlug.svg",
|
||||||
"name" : "StosPlug"
|
"name" : "StosPlug",
|
||||||
|
"opacity" : 0.5,
|
||||||
|
"position" : {
|
||||||
|
"scale" : 1,
|
||||||
|
"translation-in-points" : [
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"shadow" : {
|
"shadow" : {
|
||||||
|
|||||||
@@ -5,15 +5,15 @@ MARKETING_VERSION = 1.2.1
|
|||||||
CURRENT_PROJECT_VERSION = 1
|
CURRENT_PROJECT_VERSION = 1
|
||||||
|
|
||||||
// Vars to be overwritten by `CodeSigning.xcconfig` if exists
|
// Vars to be overwritten by `CodeSigning.xcconfig` if exists
|
||||||
DEVELOPMENT_TEAM = 95J8WZ4TN8
|
DEVELOPMENT_TEAM = 42Q7QX86GV
|
||||||
ORG_IDENTIFIER = com.stossy11
|
ORG_IDENTIFIER = com.jkcoxson
|
||||||
|
|
||||||
// Codesigning settings defined optionally, see `CodeSigning.xcconfig.example`
|
// Codesigning settings defined optionally, see `CodeSigning.xcconfig.example`
|
||||||
#include? "CodeSigning.xcconfig"
|
#include? "CodeSigning.xcconfig"
|
||||||
|
|
||||||
ORG_PREFIX = $(ORG_IDENTIFIER)
|
ORG_PREFIX = $(ORG_IDENTIFIER)
|
||||||
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = $(ORG_PREFIX).StosVPN
|
PRODUCT_BUNDLE_IDENTIFIER = $(ORG_PREFIX).LocalDevVPN
|
||||||
|
|
||||||
TUNNEL_NAME = TunnelProv
|
TUNNEL_NAME = TunnelProv
|
||||||
|
|
||||||
|
|||||||
@@ -41,13 +41,20 @@
|
|||||||
0E6351B62E18DF53002AF750 /* Build.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Build.xcconfig; sourceTree = "<group>"; };
|
0E6351B62E18DF53002AF750 /* Build.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Build.xcconfig; sourceTree = "<group>"; };
|
||||||
0E6351B72E18DF53002AF750 /* CodeSigning.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CodeSigning.xcconfig; sourceTree = "<group>"; };
|
0E6351B72E18DF53002AF750 /* CodeSigning.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CodeSigning.xcconfig; sourceTree = "<group>"; };
|
||||||
0E6351B82E18DF53002AF750 /* CodeSigning.xcconfig.sample */ = {isa = PBXFileReference; lastKnownFileType = text; path = CodeSigning.xcconfig.sample; sourceTree = "<group>"; };
|
0E6351B82E18DF53002AF750 /* CodeSigning.xcconfig.sample */ = {isa = PBXFileReference; lastKnownFileType = text; path = CodeSigning.xcconfig.sample; sourceTree = "<group>"; };
|
||||||
4EB3C7582D96631A00C1B22C /* StosVPN.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StosVPN.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
4EB3C7582D96631A00C1B22C /* LocalDevVPN.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LocalDevVPN.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
4EB3C76E2D96715400C1B22C /* TunnelProv.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TunnelProv.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
4EB3C76E2D96715400C1B22C /* TunnelProv.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TunnelProv.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
4EB3C7702D96715400C1B22C /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
|
4EB3C7702D96715400C1B22C /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
|
||||||
4EE6B99A2E8F756700E30694 /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = "<group>"; };
|
4EE6B99A2E8F756700E30694 /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||||
|
190996C92ED0FC91006411F1 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
||||||
|
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||||
|
membershipExceptions = (
|
||||||
|
Info.plist,
|
||||||
|
);
|
||||||
|
target = 4EB3C7572D96631A00C1B22C /* LocalDevVPN */;
|
||||||
|
};
|
||||||
4EB3C77A2D96715400C1B22C /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
4EB3C77A2D96715400C1B22C /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
||||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||||
membershipExceptions = (
|
membershipExceptions = (
|
||||||
@@ -55,17 +62,10 @@
|
|||||||
);
|
);
|
||||||
target = 4EB3C76D2D96715400C1B22C /* TunnelProv */;
|
target = 4EB3C76D2D96715400C1B22C /* TunnelProv */;
|
||||||
};
|
};
|
||||||
4EB3C7802D9672DE00C1B22C /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
|
||||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
|
||||||
membershipExceptions = (
|
|
||||||
Info.plist,
|
|
||||||
);
|
|
||||||
target = 4EB3C7572D96631A00C1B22C /* StosVPN */;
|
|
||||||
};
|
|
||||||
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||||
|
|
||||||
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
||||||
4EB3C75A2D96631A00C1B22C /* StosVPN */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (4EB3C7802D9672DE00C1B22C /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = StosVPN; sourceTree = "<group>"; };
|
4EB3C75A2D96631A00C1B22C /* LocalDevVPN */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (190996C92ED0FC91006411F1 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = LocalDevVPN; sourceTree = "<group>"; };
|
||||||
4EB3C7722D96715400C1B22C /* TunnelProv */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (4EB3C77A2D96715400C1B22C /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = TunnelProv; sourceTree = "<group>"; };
|
4EB3C7722D96715400C1B22C /* TunnelProv */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (4EB3C77A2D96715400C1B22C /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = TunnelProv; sourceTree = "<group>"; };
|
||||||
/* End PBXFileSystemSynchronizedRootGroup section */
|
/* End PBXFileSystemSynchronizedRootGroup section */
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
0E6351B62E18DF53002AF750 /* Build.xcconfig */,
|
0E6351B62E18DF53002AF750 /* Build.xcconfig */,
|
||||||
0E6351B72E18DF53002AF750 /* CodeSigning.xcconfig */,
|
0E6351B72E18DF53002AF750 /* CodeSigning.xcconfig */,
|
||||||
0E6351B82E18DF53002AF750 /* CodeSigning.xcconfig.sample */,
|
0E6351B82E18DF53002AF750 /* CodeSigning.xcconfig.sample */,
|
||||||
4EB3C75A2D96631A00C1B22C /* StosVPN */,
|
4EB3C75A2D96631A00C1B22C /* LocalDevVPN */,
|
||||||
4EB3C7722D96715400C1B22C /* TunnelProv */,
|
4EB3C7722D96715400C1B22C /* TunnelProv */,
|
||||||
4EB3C76F2D96715400C1B22C /* Frameworks */,
|
4EB3C76F2D96715400C1B22C /* Frameworks */,
|
||||||
4EB3C7592D96631A00C1B22C /* Products */,
|
4EB3C7592D96631A00C1B22C /* Products */,
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
4EB3C7592D96631A00C1B22C /* Products */ = {
|
4EB3C7592D96631A00C1B22C /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
4EB3C7582D96631A00C1B22C /* StosVPN.app */,
|
4EB3C7582D96631A00C1B22C /* LocalDevVPN.app */,
|
||||||
4EB3C76E2D96715400C1B22C /* TunnelProv.appex */,
|
4EB3C76E2D96715400C1B22C /* TunnelProv.appex */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
@@ -123,9 +123,9 @@
|
|||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
4EB3C7572D96631A00C1B22C /* StosVPN */ = {
|
4EB3C7572D96631A00C1B22C /* LocalDevVPN */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 4EB3C7662D96631B00C1B22C /* Build configuration list for PBXNativeTarget "StosVPN" */;
|
buildConfigurationList = 4EB3C7662D96631B00C1B22C /* Build configuration list for PBXNativeTarget "LocalDevVPN" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
4EB3C7542D96631A00C1B22C /* Sources */,
|
4EB3C7542D96631A00C1B22C /* Sources */,
|
||||||
4EB3C7552D96631A00C1B22C /* Frameworks */,
|
4EB3C7552D96631A00C1B22C /* Frameworks */,
|
||||||
@@ -138,14 +138,14 @@
|
|||||||
4EB3C7782D96715400C1B22C /* PBXTargetDependency */,
|
4EB3C7782D96715400C1B22C /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
fileSystemSynchronizedGroups = (
|
fileSystemSynchronizedGroups = (
|
||||||
4EB3C75A2D96631A00C1B22C /* StosVPN */,
|
4EB3C75A2D96631A00C1B22C /* LocalDevVPN */,
|
||||||
);
|
);
|
||||||
name = StosVPN;
|
name = LocalDevVPN;
|
||||||
packageProductDependencies = (
|
packageProductDependencies = (
|
||||||
0E6351BD2E18EABA002AF750 /* NavigationBackport */,
|
0E6351BD2E18EABA002AF750 /* NavigationBackport */,
|
||||||
);
|
);
|
||||||
productName = StosVPN;
|
productName = LocalDevVPN;
|
||||||
productReference = 4EB3C7582D96631A00C1B22C /* StosVPN.app */;
|
productReference = 4EB3C7582D96631A00C1B22C /* LocalDevVPN.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
};
|
};
|
||||||
4EB3C76D2D96715400C1B22C /* TunnelProv */ = {
|
4EB3C76D2D96715400C1B22C /* TunnelProv */ = {
|
||||||
@@ -190,7 +190,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buildConfigurationList = 4EB3C7532D96631A00C1B22C /* Build configuration list for PBXProject "StosVPN" */;
|
buildConfigurationList = 4EB3C7532D96631A00C1B22C /* Build configuration list for PBXProject "LocalDevVPN" */;
|
||||||
compatibilityVersion = "Xcode 14.0";
|
compatibilityVersion = "Xcode 14.0";
|
||||||
developmentRegion = en;
|
developmentRegion = en;
|
||||||
hasScannedForEncodings = 0;
|
hasScannedForEncodings = 0;
|
||||||
@@ -210,7 +210,7 @@
|
|||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
4EB3C7572D96631A00C1B22C /* StosVPN */,
|
4EB3C7572D96631A00C1B22C /* LocalDevVPN */,
|
||||||
4EB3C76D2D96715400C1B22C /* TunnelProv */,
|
4EB3C76D2D96715400C1B22C /* TunnelProv */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -414,8 +414,13 @@
|
|||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"StosVPN/Preview Content\"";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEVELOPMENT_ASSET_PATHS = "\"LocalDevVPN/Preview Content\"";
|
||||||
|
DEVELOPMENT_TEAM = 42Q7QX86GV;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = LocalDevVPN;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = Stossy11;
|
||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
@@ -425,9 +430,11 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.jkcoxson.LocalDevVPN;
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator";
|
SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator";
|
||||||
SUPPORTS_MACCATALYST = NO;
|
SUPPORTS_MACCATALYST = NO;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "StosVPN/StosVPN-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "LocalDevVPN/LocalDevVPN-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2,3";
|
TARGETED_DEVICE_FAMILY = "1,2,3";
|
||||||
@@ -442,8 +449,13 @@
|
|||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"StosVPN/Preview Content\"";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEVELOPMENT_ASSET_PATHS = "\"LocalDevVPN/Preview Content\"";
|
||||||
|
DEVELOPMENT_TEAM = 42Q7QX86GV;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = LocalDevVPN;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = Stossy11;
|
||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
@@ -453,9 +465,11 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = com.jkcoxson.LocalDevVPN;
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator";
|
SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator";
|
||||||
SUPPORTS_MACCATALYST = NO;
|
SUPPORTS_MACCATALYST = NO;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "StosVPN/StosVPN-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "LocalDevVPN/LocalDevVPN-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2,3";
|
TARGETED_DEVICE_FAMILY = "1,2,3";
|
||||||
TVOS_DEPLOYMENT_TARGET = 17.0;
|
TVOS_DEPLOYMENT_TARGET = 17.0;
|
||||||
@@ -465,6 +479,7 @@
|
|||||||
4EB3C77C2D96715400C1B22C /* Debug */ = {
|
4EB3C77C2D96715400C1B22C /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
DEVELOPMENT_TEAM = 42Q7QX86GV;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = TunnelProv;
|
INFOPLIST_KEY_CFBundleDisplayName = TunnelProv;
|
||||||
INFOPLIST_KEY_NSHumanReadableCopyright = Stossy11;
|
INFOPLIST_KEY_NSHumanReadableCopyright = Stossy11;
|
||||||
INFOPLIST_KEY_UIRequiredDeviceCapabilities = arm64;
|
INFOPLIST_KEY_UIRequiredDeviceCapabilities = arm64;
|
||||||
@@ -474,10 +489,12 @@
|
|||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(TUNNEL_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(TUNNEL_BUNDLE_IDENTIFIER)";
|
||||||
|
"PRODUCT_BUNDLE_IDENTIFIER[sdk=appletvos*]" = com.jkcoxson.LocalDevVPN.TunnelProv;
|
||||||
|
"PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.jkcoxson.LocalDevVPN.TunnelProv;
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator";
|
SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator";
|
||||||
SUPPORTS_MACCATALYST = NO;
|
SUPPORTS_MACCATALYST = NO;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "StosVPN/StosVPN-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "LocalDevVPN/LocalDevVPN-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2,3";
|
TARGETED_DEVICE_FAMILY = "1,2,3";
|
||||||
TVOS_DEPLOYMENT_TARGET = 17.0;
|
TVOS_DEPLOYMENT_TARGET = 17.0;
|
||||||
@@ -487,6 +504,7 @@
|
|||||||
4EB3C77D2D96715400C1B22C /* Release */ = {
|
4EB3C77D2D96715400C1B22C /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
DEVELOPMENT_TEAM = 42Q7QX86GV;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = TunnelProv;
|
INFOPLIST_KEY_CFBundleDisplayName = TunnelProv;
|
||||||
INFOPLIST_KEY_NSHumanReadableCopyright = Stossy11;
|
INFOPLIST_KEY_NSHumanReadableCopyright = Stossy11;
|
||||||
INFOPLIST_KEY_UIRequiredDeviceCapabilities = arm64;
|
INFOPLIST_KEY_UIRequiredDeviceCapabilities = arm64;
|
||||||
@@ -496,10 +514,12 @@
|
|||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(TUNNEL_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(TUNNEL_BUNDLE_IDENTIFIER)";
|
||||||
|
"PRODUCT_BUNDLE_IDENTIFIER[sdk=appletvos*]" = com.jkcoxson.LocalDevVPN.TunnelProv;
|
||||||
|
"PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = com.jkcoxson.LocalDevVPN.TunnelProv;
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator";
|
SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator";
|
||||||
SUPPORTS_MACCATALYST = NO;
|
SUPPORTS_MACCATALYST = NO;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "StosVPN/StosVPN-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "LocalDevVPN/LocalDevVPN-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2,3";
|
TARGETED_DEVICE_FAMILY = "1,2,3";
|
||||||
TVOS_DEPLOYMENT_TARGET = 17.0;
|
TVOS_DEPLOYMENT_TARGET = 17.0;
|
||||||
@@ -509,7 +529,7 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
4EB3C7532D96631A00C1B22C /* Build configuration list for PBXProject "StosVPN" */ = {
|
4EB3C7532D96631A00C1B22C /* Build configuration list for PBXProject "LocalDevVPN" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
4EB3C7642D96631B00C1B22C /* Debug */,
|
4EB3C7642D96631B00C1B22C /* Debug */,
|
||||||
@@ -518,7 +538,7 @@
|
|||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
4EB3C7662D96631B00C1B22C /* Build configuration list for PBXNativeTarget "StosVPN" */ = {
|
4EB3C7662D96631B00C1B22C /* Build configuration list for PBXNativeTarget "LocalDevVPN" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
4EB3C7672D96631B00C1B22C /* Debug */,
|
4EB3C7672D96631B00C1B22C /* Debug */,
|
||||||
@@ -16,9 +16,9 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
||||||
BuildableName = "StosVPN.app"
|
BuildableName = "LocalDevVPN.app"
|
||||||
BlueprintName = "StosVPN"
|
BlueprintName = "LocalDevVPN"
|
||||||
ReferencedContainer = "container:StosVPN.xcodeproj">
|
ReferencedContainer = "container:LocalDevVPN.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildActionEntry>
|
</BuildActionEntry>
|
||||||
</BuildActionEntries>
|
</BuildActionEntries>
|
||||||
@@ -45,9 +45,9 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
||||||
BuildableName = "StosVPN.app"
|
BuildableName = "LocalDevVPN.app"
|
||||||
BlueprintName = "StosVPN"
|
BlueprintName = "LocalDevVPN"
|
||||||
ReferencedContainer = "container:StosVPN.xcodeproj">
|
ReferencedContainer = "container:LocalDevVPN.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
@@ -62,9 +62,9 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
||||||
BuildableName = "StosVPN.app"
|
BuildableName = "LocalDevVPN.app"
|
||||||
BlueprintName = "StosVPN"
|
BlueprintName = "LocalDevVPN"
|
||||||
ReferencedContainer = "container:StosVPN.xcodeproj">
|
ReferencedContainer = "container:LocalDevVPN.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
</ProfileAction>
|
</ProfileAction>
|
||||||
@@ -31,8 +31,8 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
||||||
BuildableName = "StosVPN.app"
|
BuildableName = "LocalDevVPN.app"
|
||||||
BlueprintName = "StosVPN"
|
BlueprintName = "LocalDevVPN"
|
||||||
ReferencedContainer = "container:StosVPN.xcodeproj">
|
ReferencedContainer = "container:StosVPN.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildActionEntry>
|
</BuildActionEntry>
|
||||||
@@ -62,8 +62,8 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
||||||
BuildableName = "StosVPN.app"
|
BuildableName = "LocalDevVPN.app"
|
||||||
BlueprintName = "StosVPN"
|
BlueprintName = "LocalDevVPN"
|
||||||
ReferencedContainer = "container:StosVPN.xcodeproj">
|
ReferencedContainer = "container:StosVPN.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
@@ -81,8 +81,8 @@
|
|||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
BlueprintIdentifier = "4EB3C7572D96631A00C1B22C"
|
||||||
BuildableName = "StosVPN.app"
|
BuildableName = "LocalDevVPN.app"
|
||||||
BlueprintName = "StosVPN"
|
BlueprintName = "LocalDevVPN"
|
||||||
ReferencedContainer = "container:StosVPN.xcodeproj">
|
ReferencedContainer = "container:StosVPN.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 160 KiB |
@@ -1,13 +1,13 @@
|
|||||||
//
|
//
|
||||||
// ContentView.swift
|
// ContentView.swift
|
||||||
// StosVPN
|
// LocalDevVPN
|
||||||
//
|
//
|
||||||
// Created by Stossy11 on 28/03/2025.
|
// Created by Stossy11 on 28/03/2025.
|
||||||
//
|
//
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import NetworkExtension
|
import NetworkExtension
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
import NavigationBackport
|
import NavigationBackport
|
||||||
|
|
||||||
@@ -17,6 +17,7 @@ extension Bundle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Logging Utility
|
// MARK: - Logging Utility
|
||||||
|
|
||||||
class VPNLogger: ObservableObject {
|
class VPNLogger: ObservableObject {
|
||||||
@Published var logs: [String] = []
|
@Published var logs: [String] = []
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ class VPNLogger: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Tunnel Manager
|
// MARK: - Tunnel Manager
|
||||||
|
|
||||||
class TunnelManager: ObservableObject {
|
class TunnelManager: ObservableObject {
|
||||||
@Published var hasLocalDeviceSupport = false
|
@Published var hasLocalDeviceSupport = false
|
||||||
@Published var tunnelStatus: TunnelStatus = .disconnected
|
@Published var tunnelStatus: TunnelStatus = .disconnected
|
||||||
@@ -111,8 +113,9 @@ class TunnelManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private Methods
|
// MARK: - Private Methods
|
||||||
|
|
||||||
private func loadTunnelPreferences() {
|
private func loadTunnelPreferences() {
|
||||||
NETunnelProviderManager.loadAllFromPreferences { [weak self] (managers, error) in
|
NETunnelProviderManager.loadAllFromPreferences { [weak self] managers, error in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
@@ -140,11 +143,11 @@ class TunnelManager: ObservableObject {
|
|||||||
} else if let manager = stosManagers.first {
|
} else if let manager = stosManagers.first {
|
||||||
self.vpnManager = manager
|
self.vpnManager = manager
|
||||||
let currentStatus = manager.connection.status
|
let currentStatus = manager.connection.status
|
||||||
VPNLogger.shared.log("Loaded existing StosVPN tunnel configuration with status: \(currentStatus.rawValue)")
|
VPNLogger.shared.log("Loaded existing LocalDevVPN tunnel configuration with status: \(currentStatus.rawValue)")
|
||||||
self.updateTunnelStatus(from: currentStatus)
|
self.updateTunnelStatus(from: currentStatus)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
VPNLogger.shared.log("No StosVPN tunnel configuration found")
|
VPNLogger.shared.log("No LocalDevVPN tunnel configuration found")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
VPNLogger.shared.log("No existing tunnel configurations found")
|
VPNLogger.shared.log("No existing tunnel configurations found")
|
||||||
@@ -154,7 +157,7 @@ class TunnelManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func cleanupDuplicateManagers(_ managers: [NETunnelProviderManager]) {
|
private func cleanupDuplicateManagers(_ managers: [NETunnelProviderManager]) {
|
||||||
VPNLogger.shared.log("Found \(managers.count) StosVPN configurations. Cleaning up duplicates...")
|
VPNLogger.shared.log("Found \(managers.count) LocalDevVPN configurations. Cleaning up duplicates...")
|
||||||
|
|
||||||
let activeManager = managers.first {
|
let activeManager = managers.first {
|
||||||
$0.connection.status == .connected || $0.connection.status == .connecting
|
$0.connection.status == .connected || $0.connection.status == .connecting
|
||||||
@@ -218,14 +221,14 @@ class TunnelManager: ObservableObject {
|
|||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
if self.tunnelStatus != newStatus {
|
if self.tunnelStatus != newStatus {
|
||||||
VPNLogger.shared.log("StosVPN status updated from \(self.tunnelStatus) to \(newStatus)")
|
VPNLogger.shared.log("LocalDevVPN status updated from \(self.tunnelStatus) to \(newStatus)")
|
||||||
}
|
}
|
||||||
self.tunnelStatus = newStatus
|
self.tunnelStatus = newStatus
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createStosVPNConfiguration(completion: @escaping (NETunnelProviderManager?) -> Void) {
|
private func createLocalDevVPNConfiguration(completion: @escaping (NETunnelProviderManager?) -> Void) {
|
||||||
NETunnelProviderManager.loadAllFromPreferences { [weak self] (managers, error) in
|
NETunnelProviderManager.loadAllFromPreferences { [weak self] managers, error in
|
||||||
guard let self = self else {
|
guard let self = self else {
|
||||||
completion(nil)
|
completion(nil)
|
||||||
return
|
return
|
||||||
@@ -246,18 +249,18 @@ class TunnelManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let existingManager = stosManagers.first {
|
if let existingManager = stosManagers.first {
|
||||||
VPNLogger.shared.log("Found existing StosVPN configuration, using it instead of creating new one")
|
VPNLogger.shared.log("Found existing LocalDevVPN configuration, using it instead of creating new one")
|
||||||
completion(existingManager)
|
completion(existingManager)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let manager = NETunnelProviderManager()
|
let manager = NETunnelProviderManager()
|
||||||
manager.localizedDescription = "StosVPN"
|
manager.localizedDescription = "LocalDevVPN"
|
||||||
|
|
||||||
let proto = NETunnelProviderProtocol()
|
let proto = NETunnelProviderProtocol()
|
||||||
proto.providerBundleIdentifier = self.tunnelBundleId
|
proto.providerBundleIdentifier = self.tunnelBundleId
|
||||||
proto.serverAddress = "StosVPN's Local Network Tunnel"
|
proto.serverAddress = "LocalDevVPN's Local Network Tunnel"
|
||||||
manager.protocolConfiguration = proto
|
manager.protocolConfiguration = proto
|
||||||
|
|
||||||
let onDemandRule = NEOnDemandRuleEvaluateConnection()
|
let onDemandRule = NEOnDemandRuleEvaluateConnection()
|
||||||
@@ -274,12 +277,12 @@ class TunnelManager: ObservableObject {
|
|||||||
manager.saveToPreferences { error in
|
manager.saveToPreferences { error in
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
if let error = error {
|
if let error = error {
|
||||||
VPNLogger.shared.log("Error creating StosVPN configuration: \(error.localizedDescription)")
|
VPNLogger.shared.log("Error creating LocalDevVPN configuration: \(error.localizedDescription)")
|
||||||
completion(nil)
|
completion(nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
VPNLogger.shared.log("StosVPN configuration created successfully")
|
VPNLogger.shared.log("LocalDevVPN configuration created successfully")
|
||||||
completion(manager)
|
completion(manager)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -343,19 +346,20 @@ class TunnelManager: ObservableObject {
|
|||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
|
||||||
if let activeManager = activeManager,
|
if let activeManager = activeManager,
|
||||||
(activeManager.protocolConfiguration as? NETunnelProviderProtocol)?.providerBundleIdentifier != self.tunnelBundleId {
|
(activeManager.protocolConfiguration as? NETunnelProviderProtocol)?.providerBundleIdentifier != self.tunnelBundleId
|
||||||
VPNLogger.shared.log("Disconnecting existing VPN connection before starting StosVPN")
|
{
|
||||||
|
VPNLogger.shared.log("Disconnecting existing VPN connection before starting LocalDevVPN")
|
||||||
|
|
||||||
UserDefaults.standard.set(true, forKey: "ShouldStartStosVPNAfterDisconnect")
|
UserDefaults.standard.set(true, forKey: "ShouldStartLocalDevVPNAfterDisconnect")
|
||||||
activeManager.connection.stopVPNTunnel()
|
activeManager.connection.stopVPNTunnel()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
self.initializeAndStartStosVPN()
|
self.initializeAndStartLocalDevVPN()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func initializeAndStartStosVPN() {
|
private func initializeAndStartLocalDevVPN() {
|
||||||
if let manager = vpnManager {
|
if let manager = vpnManager {
|
||||||
manager.loadFromPreferences { [weak self] error in
|
manager.loadFromPreferences { [weak self] error in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
@@ -405,7 +409,7 @@ class TunnelManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.createStosVPNConfiguration { [weak self] manager in
|
self.createLocalDevVPNConfiguration { [weak self] manager in
|
||||||
guard let self = self, let manager = manager else { return }
|
guard let self = self, let manager = manager else { return }
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
self?.vpnManager = manager
|
self?.vpnManager = manager
|
||||||
@@ -421,7 +425,7 @@ class TunnelManager: ObservableObject {
|
|||||||
VPNLogger.shared.log("Current VPN status before start attempt: \(currentStatus.rawValue)")
|
VPNLogger.shared.log("Current VPN status before start attempt: \(currentStatus.rawValue)")
|
||||||
|
|
||||||
if currentStatus == .connected {
|
if currentStatus == .connected {
|
||||||
VPNLogger.shared.log("StosVPN tunnel is already connected")
|
VPNLogger.shared.log("LocalDevVPN tunnel is already connected")
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
self?.tunnelStatus = .connected
|
self?.tunnelStatus = .connected
|
||||||
}
|
}
|
||||||
@@ -429,7 +433,7 @@ class TunnelManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if currentStatus == .connecting {
|
if currentStatus == .connecting {
|
||||||
VPNLogger.shared.log("StosVPN tunnel is already connecting")
|
VPNLogger.shared.log("LocalDevVPN tunnel is already connecting")
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
self?.tunnelStatus = .connecting
|
self?.tunnelStatus = .connecting
|
||||||
}
|
}
|
||||||
@@ -478,17 +482,17 @@ class TunnelManager: ObservableObject {
|
|||||||
let options: [String: NSObject] = [
|
let options: [String: NSObject] = [
|
||||||
"TunnelDeviceIP": self.tunnelDeviceIp as NSObject,
|
"TunnelDeviceIP": self.tunnelDeviceIp as NSObject,
|
||||||
"TunnelFakeIP": self.tunnelFakeIp as NSObject,
|
"TunnelFakeIP": self.tunnelFakeIp as NSObject,
|
||||||
"TunnelSubnetMask": self.tunnelSubnetMask as NSObject
|
"TunnelSubnetMask": self.tunnelSubnetMask as NSObject,
|
||||||
]
|
]
|
||||||
|
|
||||||
do {
|
do {
|
||||||
try manager.connection.startVPNTunnel(options: options)
|
try manager.connection.startVPNTunnel(options: options)
|
||||||
VPNLogger.shared.log("StosVPN tunnel start initiated")
|
VPNLogger.shared.log("LocalDevVPN tunnel start initiated")
|
||||||
} catch {
|
} catch {
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
self?.tunnelStatus = .error
|
self?.tunnelStatus = .error
|
||||||
}
|
}
|
||||||
VPNLogger.shared.log("Failed to start StosVPN tunnel: \(error.localizedDescription)")
|
VPNLogger.shared.log("Failed to start LocalDevVPN tunnel: \(error.localizedDescription)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -505,9 +509,9 @@ class TunnelManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
manager.connection.stopVPNTunnel()
|
manager.connection.stopVPNTunnel()
|
||||||
VPNLogger.shared.log("StosVPN tunnel stop initiated")
|
VPNLogger.shared.log("LocalDevVPN tunnel stop initiated")
|
||||||
|
|
||||||
UserDefaults.standard.removeObject(forKey: "ShouldStartStosVPNAfterDisconnect")
|
UserDefaults.standard.removeObject(forKey: "ShouldStartLocalDevVPNAfterDisconnect")
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleVPNStatusChange(notification: Notification) {
|
func handleVPNStatusChange(notification: Notification) {
|
||||||
@@ -517,16 +521,17 @@ class TunnelManager: ObservableObject {
|
|||||||
|
|
||||||
// Always update status if it's our manager's connection
|
// Always update status if it's our manager's connection
|
||||||
if let manager = vpnManager, connection == manager.connection {
|
if let manager = vpnManager, connection == manager.connection {
|
||||||
VPNLogger.shared.log("Status change is for our StosVPN manager")
|
VPNLogger.shared.log("Status change is for our LocalDevVPN manager")
|
||||||
updateTunnelStatus(from: connection.status)
|
updateTunnelStatus(from: connection.status)
|
||||||
}
|
}
|
||||||
|
|
||||||
if connection.status == .disconnected &&
|
if connection.status == .disconnected &&
|
||||||
UserDefaults.standard.bool(forKey: "ShouldStartStosVPNAfterDisconnect") {
|
UserDefaults.standard.bool(forKey: "ShouldStartLocalDevVPNAfterDisconnect")
|
||||||
UserDefaults.standard.removeObject(forKey: "ShouldStartStosVPNAfterDisconnect")
|
{
|
||||||
|
UserDefaults.standard.removeObject(forKey: "ShouldStartLocalDevVPNAfterDisconnect")
|
||||||
|
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
|
||||||
self?.initializeAndStartStosVPN()
|
self?.initializeAndStartLocalDevVPN()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -539,7 +544,7 @@ class TunnelManager: ObservableObject {
|
|||||||
DispatchQueue.global(qos: .utility).async { [weak self] in
|
DispatchQueue.global(qos: .utility).async { [weak self] in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
|
||||||
NETunnelProviderManager.loadAllFromPreferences { [weak self] managers, error in
|
NETunnelProviderManager.loadAllFromPreferences { [weak self] managers, _ in
|
||||||
guard let self = self, let managers = managers, !managers.isEmpty else {
|
guard let self = self, let managers = managers, !managers.isEmpty else {
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
self?.isProcessingStatusChange = false
|
self?.isProcessingStatusChange = false
|
||||||
@@ -582,7 +587,8 @@ class TunnelManager: ObservableObject {
|
|||||||
|
|
||||||
for manager in managers {
|
for manager in managers {
|
||||||
guard let proto = manager.protocolConfiguration as? NETunnelProviderProtocol,
|
guard let proto = manager.protocolConfiguration as? NETunnelProviderProtocol,
|
||||||
proto.providerBundleIdentifier == self.tunnelBundleId else {
|
proto.providerBundleIdentifier == self.tunnelBundleId
|
||||||
|
else {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,7 +648,7 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding()
|
.padding()
|
||||||
.navigationTitle("StosVPN")
|
.navigationTitle("LocalDevVPN")
|
||||||
.tvOSNavigationBarTitleDisplayMode(.inline)
|
.tvOSNavigationBarTitleDisplayMode(.inline)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
ToolbarItem(placement: .topBarTrailing) {
|
ToolbarItem(placement: .topBarTrailing) {
|
||||||
@@ -673,14 +679,13 @@ extension View {
|
|||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
func tvOSNavigationBarTitleDisplayMode(_ displayMode: NavigationBarItem.TitleDisplayMode) -> some View {
|
func tvOSNavigationBarTitleDisplayMode(_ displayMode: NavigationBarItem.TitleDisplayMode) -> some View {
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
self.navigationBarTitleDisplayMode(displayMode)
|
navigationBarTitleDisplayMode(displayMode)
|
||||||
#else
|
#else
|
||||||
self
|
self
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct StatusIndicatorView: View {
|
struct StatusIndicatorView: View {
|
||||||
@StateObject private var tunnelManager = TunnelManager.shared
|
@StateObject private var tunnelManager = TunnelManager.shared
|
||||||
@State private var animationAmount = 1.0
|
@State private var animationAmount = 1.0
|
||||||
@@ -746,7 +751,6 @@ struct StatusIndicatorView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct ConnectionButton: View {
|
struct ConnectionButton: View {
|
||||||
@StateObject private var tunnelManager = TunnelManager.shared
|
@StateObject private var tunnelManager = TunnelManager.shared
|
||||||
let action: () -> Void
|
let action: () -> Void
|
||||||
@@ -888,6 +892,7 @@ struct StatItemView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Updated SettingsView
|
// MARK: - Updated SettingsView
|
||||||
|
|
||||||
struct SettingsView: View {
|
struct SettingsView: View {
|
||||||
@Environment(\.presentationMode) var presentationMode
|
@Environment(\.presentationMode) var presentationMode
|
||||||
@AppStorage("selectedLanguage") private var selectedLanguage = Locale.current.languageCode ?? "en"
|
@AppStorage("selectedLanguage") private var selectedLanguage = Locale.current.languageCode ?? "en"
|
||||||
@@ -1000,7 +1005,7 @@ struct SettingsView: View {
|
|||||||
.multilineTextAlignment(.trailing)
|
.multilineTextAlignment(.trailing)
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
.keyboardType(.numbersAndPunctuation)
|
.keyboardType(.numbersAndPunctuation)
|
||||||
.onChange(of: text.wrappedValue) { newValue in
|
.onChange(of: text.wrappedValue) { _ in
|
||||||
if !shownTunnelAlert {
|
if !shownTunnelAlert {
|
||||||
showNetworkWarning = true
|
showNetworkWarning = true
|
||||||
}
|
}
|
||||||
@@ -1016,6 +1021,7 @@ struct SettingsView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - New Data Collection Info View
|
// MARK: - New Data Collection Info View
|
||||||
|
|
||||||
struct DataCollectionInfoView: View {
|
struct DataCollectionInfoView: View {
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
@@ -1188,7 +1194,7 @@ struct SetupView: View {
|
|||||||
description: "setup_privacy_description",
|
description: "setup_privacy_description",
|
||||||
imageName: "lock.shield.fill",
|
imageName: "lock.shield.fill",
|
||||||
details: "setup_privacy_details"
|
details: "setup_privacy_details"
|
||||||
)
|
),
|
||||||
]
|
]
|
||||||
var body: some View {
|
var body: some View {
|
||||||
NBNavigationStack {
|
NBNavigationStack {
|
||||||
@@ -1233,7 +1239,6 @@ struct SetupView: View {
|
|||||||
}
|
}
|
||||||
.padding(.bottom)
|
.padding(.bottom)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.navigationTitle(Text("setup_nav"))
|
.navigationTitle(Text("setup_nav"))
|
||||||
.tvOSNavigationBarTitleDisplayMode(.inline)
|
.tvOSNavigationBarTitleDisplayMode(.inline)
|
||||||
@@ -1290,6 +1295,7 @@ struct SetupPageView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Conditional sizes for tvOS
|
// MARK: - Conditional sizes for tvOS
|
||||||
|
|
||||||
private var tvOSImageSize: CGFloat {
|
private var tvOSImageSize: CGFloat {
|
||||||
#if os(tvOS)
|
#if os(tvOS)
|
||||||
return 60
|
return 60
|
||||||
@@ -1339,7 +1345,6 @@ struct SetupPageView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class LanguageManager: ObservableObject {
|
class LanguageManager: ObservableObject {
|
||||||
static let shared = LanguageManager()
|
static let shared = LanguageManager()
|
||||||
@Published var currentLanguage: String = Locale.current.languageCode ?? "en"
|
@Published var currentLanguage: String = Locale.current.languageCode ?? "en"
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"disconnect" = "Disconnect";
|
"disconnect" = "Disconnect";
|
||||||
"connecting_ellipsis" = "Connecting...";
|
"connecting_ellipsis" = "Connecting...";
|
||||||
"disconnecting_ellipsis" = "Disconnecting...";
|
"disconnecting_ellipsis" = "Disconnecting...";
|
||||||
"server_address_name" = "StosVPN Local Tunnel";
|
"server_address_name" = "LocalDevVPN Local Tunnel";
|
||||||
|
|
||||||
"local_tunnel_details" = "Tunnel Details";
|
"local_tunnel_details" = "Tunnel Details";
|
||||||
"time_connected" = "Time Connected";
|
"time_connected" = "Time Connected";
|
||||||
@@ -53,32 +53,32 @@
|
|||||||
|
|
||||||
"data_collection_policy_title" = "Data Collection Policy";
|
"data_collection_policy_title" = "Data Collection Policy";
|
||||||
"no_data_collection" = "No Data Collection";
|
"no_data_collection" = "No Data Collection";
|
||||||
"no_data_collection_description" = "StosVPN DOES NOT collect user data, traffic information, or browsing activity. This app creates a local network tunnel that stays entirely on your device.";
|
"no_data_collection_description" = "LocalDevVPN DOES NOT collect user data, traffic information, or browsing activity. This app creates a local network tunnel that stays entirely on your device.";
|
||||||
"local_processing_only" = "Local Processing Only";
|
"local_processing_only" = "Local Processing Only";
|
||||||
"local_processing_only_description" = "All network traffic and configurations are processed locally on your device. No information ever leaves the device or is transmitted over the Internet.";
|
"local_processing_only_description" = "All network traffic and configurations are processed locally on your device. No information ever leaves the device or is transmitted over the Internet.";
|
||||||
"no_third_party_sharing" = "No Third Party Sharing";
|
"no_third_party_sharing" = "No Third Party Sharing";
|
||||||
"no_third_party_sharing_description" = "Since we do not collect data, there is no sharing with third parties. We do not have analytics, tracking, or data collection mechanisms in this app.";
|
"no_third_party_sharing_description" = "Since we do not collect data, there is no sharing with third parties. We do not have analytics, tracking, or data collection mechanisms in this app.";
|
||||||
"why_use_network_permissions" = "Why Use Network Permissions?";
|
"why_use_network_permissions" = "Why Use Network Permissions?";
|
||||||
"why_use_network_permissions_description" = "StosVPN requires network extension permissions to create a local network interface on your device. This is used exclusively for local development and testing.";
|
"why_use_network_permissions_description" = "LocalDevVPN requires network extension permissions to create a local network interface on your device. This is used exclusively for local development and testing.";
|
||||||
"our_promise" = "Our Promise";
|
"our_promise" = "Our Promise";
|
||||||
"our_promise_description" = "We are committed to privacy and transparency. This app is designed for developers to test and connect to local servers with no privacy concerns.";
|
"our_promise_description" = "We are committed to privacy and transparency. This app is designed for developers to test and connect to local servers with no privacy concerns.";
|
||||||
"data_collection_policy_nav" = "Data Collection";
|
"data_collection_policy_nav" = "Data Collection";
|
||||||
"logs_nav" = "Logs";
|
"logs_nav" = "Logs";
|
||||||
"faq_header" = "Frequently Asked Questions";
|
"faq_header" = "Frequently Asked Questions";
|
||||||
"faq_q1" = "What does this app do?";
|
"faq_q1" = "What does this app do?";
|
||||||
"faq_q1_a1" = "StosVPN creates a local network interface for development and testing. It does not route traffic through external servers: everything stays on the device.";
|
"faq_q1_a1" = "LocalDevVPN creates a local network interface for development and testing. It does not route traffic through external servers: everything stays on the device.";
|
||||||
"faq_common_use_cases" = "Common use cases include:";
|
"faq_common_use_cases" = "Common use cases include:";
|
||||||
"faq_case1" = "• Web app testing with local servers";
|
"faq_case1" = "• Web app testing with local servers";
|
||||||
"faq_case2" = "• Development and debugging of network features";
|
"faq_case2" = "• Development and debugging of network features";
|
||||||
"faq_case3" = "• Accessing hosted local development environments";
|
"faq_case3" = "• Accessing hosted local development environments";
|
||||||
"faq_case4" = "• Testing apps that require specific network configurations";
|
"faq_case4" = "• Testing apps that require specific network configurations";
|
||||||
"faq_q2" = "Is it a traditional VPN?";
|
"faq_q2" = "Is it a traditional VPN?";
|
||||||
"faq_q2_a1" = "No, StosVPN is NOT a traditional VPN service. It does NOT:";
|
"faq_q2_a1" = "No, LocalDevVPN is NOT a traditional VPN service. It does NOT:";
|
||||||
"faq_q2_point1" = "• Route your traffic through external servers";
|
"faq_q2_point1" = "• Route your traffic through external servers";
|
||||||
"faq_q2_point2" = "• Provide privacy or anonymity for browsing";
|
"faq_q2_point2" = "• Provide privacy or anonymity for browsing";
|
||||||
"faq_q2_point3" = "• Connect to remote VPN servers";
|
"faq_q2_point3" = "• Connect to remote VPN servers";
|
||||||
"faq_q2_point4" = "• Encrypt or route your internet traffic";
|
"faq_q2_point4" = "• Encrypt or route your internet traffic";
|
||||||
"faq_q2_a2" = "StosVPN only creates a local network interface to help developers connect to local services for development and testing.";
|
"faq_q2_a2" = "LocalDevVPN only creates a local network interface to help developers connect to local services for development and testing.";
|
||||||
"faq_q3" = "Why does the connection fail?";
|
"faq_q3" = "Why does the connection fail?";
|
||||||
"faq_q3_a1" = "Connection failures may be due to system permissions, configuration errors, or iOS restrictions.";
|
"faq_q3_a1" = "Connection failures may be due to system permissions, configuration errors, or iOS restrictions.";
|
||||||
"faq_troubleshoot_header" = "Troubleshooting steps:";
|
"faq_troubleshoot_header" = "Troubleshooting steps:";
|
||||||
@@ -87,15 +87,15 @@
|
|||||||
"faq_troubleshoot3" = "• Check if the IP configuration is valid";
|
"faq_troubleshoot3" = "• Check if the IP configuration is valid";
|
||||||
"faq_troubleshoot4" = "• Restart the device if problems persist";
|
"faq_troubleshoot4" = "• Restart the device if problems persist";
|
||||||
"faq_q4" = "Who is this app for?";
|
"faq_q4" = "Who is this app for?";
|
||||||
"faq_q4_intro" = "StosVPN is primarily designed for:";
|
"faq_q4_intro" = "LocalDevVPN is primarily designed for:";
|
||||||
"faq_q4_case1" = "• Developers testing local web servers";
|
"faq_q4_case1" = "• Developers testing local web servers";
|
||||||
"faq_q4_case2" = "• App developers testing network features";
|
"faq_q4_case2" = "• App developers testing network features";
|
||||||
"faq_q4_case3" = "• QA engineers testing apps in isolated environments";
|
"faq_q4_case3" = "• QA engineers testing apps in isolated environments";
|
||||||
"faq_q4_case4" = "• Anyone needing access to local services on iOS";
|
"faq_q4_case4" = "• Anyone needing access to local services on iOS";
|
||||||
"faq_q4_conclusion" = "This app is publicly available and useful for developers who need to test apps with network features on iOS.";
|
"faq_q4_conclusion" = "This app is publicly available and useful for developers who need to test apps with network features on iOS.";
|
||||||
"business_model_header" = "Business Model";
|
"business_model_header" = "Business Model";
|
||||||
"biz_q1" = "How does StosVPN work?";
|
"biz_q1" = "How does LocalDevVPN work?";
|
||||||
"biz_q1_a1" = "StosVPN is a completely free app available to the public. There are no paid features, subscriptions, or in-app purchases.";
|
"biz_q1_a1" = "LocalDevVPN is a completely free app available to the public. There are no paid features, subscriptions, or in-app purchases.";
|
||||||
"biz_key_points_header" = "Key points of our model:";
|
"biz_key_points_header" = "Key points of our model:";
|
||||||
"biz_point1" = "• The app is not tied to any company or group";
|
"biz_point1" = "• The app is not tied to any company or group";
|
||||||
"biz_point2" = "• Anyone can download and use the app from the App Store";
|
"biz_point2" = "• Anyone can download and use the app from the App Store";
|
||||||
@@ -106,18 +106,18 @@
|
|||||||
"requires_ios" = "Requires iOS 14.0 or later";
|
"requires_ios" = "Requires iOS 14.0 or later";
|
||||||
"uses_network_extension" = "Uses Apple Network Extension APIs";
|
"uses_network_extension" = "Uses Apple Network Extension APIs";
|
||||||
"help_and_support_nav" = "Help & Support";
|
"help_and_support_nav" = "Help & Support";
|
||||||
"setup_welcome_title" = "Welcome to StosVPN";
|
"setup_welcome_title" = "Welcome to LocalDevVPN";
|
||||||
"setup_welcome_description" = "A simple local network tunnel for developers";
|
"setup_welcome_description" = "A simple local network tunnel for developers";
|
||||||
"setup_welcome_details" = "StosVPN creates a local network interface for development, testing, and access to local servers. This app DOES NOT collect user data or route traffic through external servers.";
|
"setup_welcome_details" = "LocalDevVPN creates a local network interface for development, testing, and access to local servers. This app DOES NOT collect user data or route traffic through external servers.";
|
||||||
"setup_why_title" = "Why Use StosVPN?";
|
"setup_why_title" = "Why Use LocalDevVPN?";
|
||||||
"setup_why_description" = "Perfect for iOS developers";
|
"setup_why_description" = "Perfect for iOS developers";
|
||||||
"setup_why_details" = "• Access local web servers and development environments\n• Test apps requiring specific network configurations\n• Connect to local network services without complex setup\n• Create isolated testing environments";
|
"setup_why_details" = "• Access local web servers and development environments\n• Test apps requiring specific network configurations\n• Connect to local network services without complex setup\n• Create isolated testing environments";
|
||||||
"setup_easy_title" = "Easy to Use";
|
"setup_easy_title" = "Easy to Use";
|
||||||
"setup_easy_description" = "Just one tap to connect";
|
"setup_easy_description" = "Just one tap to connect";
|
||||||
"setup_easy_details" = "StosVPN is designed to be simple. Just tap the connect button to establish a local tunnel with preconfigured settings.";
|
"setup_easy_details" = "LocalDevVPN is designed to be simple. Just tap the connect button to establish a local tunnel with preconfigured settings.";
|
||||||
"setup_privacy_title" = "Privacy Focused";
|
"setup_privacy_title" = "Privacy Focused";
|
||||||
"setup_privacy_description" = "Your data stays on the device";
|
"setup_privacy_description" = "Your data stays on the device";
|
||||||
"setup_privacy_details" = "StosVPN creates a local tunnel that does not route traffic through external servers. All traffic stays on your device, ensuring privacy and security. No data is collected or shared with third parties.";
|
"setup_privacy_details" = "LocalDevVPN creates a local tunnel that does not route traffic through external servers. All traffic stays on your device, ensuring privacy and security. No data is collected or shared with third parties.";
|
||||||
"setup_nav" = "Setup";
|
"setup_nav" = "Setup";
|
||||||
"setup_get_started" = "Get Started";
|
"setup_get_started" = "Get Started";
|
||||||
"setup_next" = "Next";
|
"setup_next" = "Next";
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"disconnect" = "Desconectar";
|
"disconnect" = "Desconectar";
|
||||||
"connecting_ellipsis" = "Conectando...";
|
"connecting_ellipsis" = "Conectando...";
|
||||||
"disconnecting_ellipsis" = "Desconectando...";
|
"disconnecting_ellipsis" = "Desconectando...";
|
||||||
"server_address_name" = "Túnel Local de StosVPN";
|
"server_address_name" = "Túnel Local de LocalDevVPN";
|
||||||
|
|
||||||
"local_tunnel_details" = "Detalles del Túnel";
|
"local_tunnel_details" = "Detalles del Túnel";
|
||||||
"time_connected" = "Tiempo Conectado";
|
"time_connected" = "Tiempo Conectado";
|
||||||
@@ -53,32 +53,32 @@
|
|||||||
|
|
||||||
"data_collection_policy_title" = "Política de Recopilación de Datos";
|
"data_collection_policy_title" = "Política de Recopilación de Datos";
|
||||||
"no_data_collection" = "No Recopilación de Datos";
|
"no_data_collection" = "No Recopilación de Datos";
|
||||||
"no_data_collection_description" = "StosVPN NO recopila datos de usuarios, información sobre el tráfico o actividad de navegación. Esta app crea un túnel de red local que permanece completamente en tu dispositivo.";
|
"no_data_collection_description" = "LocalDevVPN NO recopila datos de usuarios, información sobre el tráfico o actividad de navegación. Esta app crea un túnel de red local que permanece completamente en tu dispositivo.";
|
||||||
"local_processing_only" = "Solo Procesamiento Local";
|
"local_processing_only" = "Solo Procesamiento Local";
|
||||||
"local_processing_only_description" = "Todo el tráfico de red y configuraciones se procesan localmente en tu dispositivo. Ninguna información deja el dispositivo ni se transmite a Internet.";
|
"local_processing_only_description" = "Todo el tráfico de red y configuraciones se procesan localmente en tu dispositivo. Ninguna información deja el dispositivo ni se transmite a Internet.";
|
||||||
"no_third_party_sharing" = "No Compartir con Terceros";
|
"no_third_party_sharing" = "No Compartir con Terceros";
|
||||||
"no_third_party_sharing_description" = "Dado que no recopilamos datos, no compartimos con terceros. No tenemos análisis, rastreo ni mecanismos de recopilación de datos en esta app.";
|
"no_third_party_sharing_description" = "Dado que no recopilamos datos, no compartimos con terceros. No tenemos análisis, rastreo ni mecanismos de recopilación de datos en esta app.";
|
||||||
"why_use_network_permissions" = "¿Por Qué Usar Permisos de Red?";
|
"why_use_network_permissions" = "¿Por Qué Usar Permisos de Red?";
|
||||||
"why_use_network_permissions_description" = "StosVPN requiere permisos de extensión de red para crear una interfaz de red local en tu dispositivo. Esto se utiliza exclusivamente para desarrollo y pruebas locales.";
|
"why_use_network_permissions_description" = "LocalDevVPN requiere permisos de extensión de red para crear una interfaz de red local en tu dispositivo. Esto se utiliza exclusivamente para desarrollo y pruebas locales.";
|
||||||
"our_promise" = "Nuestra Promesa";
|
"our_promise" = "Nuestra Promesa";
|
||||||
"our_promise_description" = "Estamos comprometidos con la privacidad y la transparencia. Esta app está diseñada para desarrolladores para probar y conectarse a servidores locales sin preocupaciones sobre la privacidad.";
|
"our_promise_description" = "Estamos comprometidos con la privacidad y la transparencia. Esta app está diseñada para desarrolladores para probar y conectarse a servidores locales sin preocupaciones sobre la privacidad.";
|
||||||
"data_collection_policy_nav" = "Recopilación de Datos";
|
"data_collection_policy_nav" = "Recopilación de Datos";
|
||||||
"logs_nav" = "Registros";
|
"logs_nav" = "Registros";
|
||||||
"faq_header" = "Preguntas Frecuentes";
|
"faq_header" = "Preguntas Frecuentes";
|
||||||
"faq_q1" = "¿Qué hace esta app?";
|
"faq_q1" = "¿Qué hace esta app?";
|
||||||
"faq_q1_a1" = "StosVPN crea una interfaz de red local útil para el desarrollo y las pruebas. No enruta el tráfico a través de servidores externos: todo permanece en el dispositivo.";
|
"faq_q1_a1" = "LocalDevVPN crea una interfaz de red local útil para el desarrollo y las pruebas. No enruta el tráfico a través de servidores externos: todo permanece en el dispositivo.";
|
||||||
"faq_common_use_cases" = "Los casos de uso comunes incluyen:";
|
"faq_common_use_cases" = "Los casos de uso comunes incluyen:";
|
||||||
"faq_case1" = "• Pruebas de aplicaciones web con servidores locales";
|
"faq_case1" = "• Pruebas de aplicaciones web con servidores locales";
|
||||||
"faq_case2" = "• Desarrollo y depuración de funcionalidades de red";
|
"faq_case2" = "• Desarrollo y depuración de funcionalidades de red";
|
||||||
"faq_case3" = "• Acceso a entornos de desarrollo locales alojados";
|
"faq_case3" = "• Acceso a entornos de desarrollo locales alojados";
|
||||||
"faq_case4" = "• Pruebas de apps que requieren configuraciones de red específicas";
|
"faq_case4" = "• Pruebas de apps que requieren configuraciones de red específicas";
|
||||||
"faq_q2" = "¿Es una VPN tradicional?";
|
"faq_q2" = "¿Es una VPN tradicional?";
|
||||||
"faq_q2_a1" = "No, StosVPN NO es un servicio de VPN tradicional. No:";
|
"faq_q2_a1" = "No, LocalDevVPN NO es un servicio de VPN tradicional. No:";
|
||||||
"faq_q2_point1" = "• Enruta tu tráfico a través de servidores externos";
|
"faq_q2_point1" = "• Enruta tu tráfico a través de servidores externos";
|
||||||
"faq_q2_point2" = "• Proporciona privacidad o anonimato para la navegación";
|
"faq_q2_point2" = "• Proporciona privacidad o anonimato para la navegación";
|
||||||
"faq_q2_point3" = "• Se conecta a servidores VPN remotos";
|
"faq_q2_point3" = "• Se conecta a servidores VPN remotos";
|
||||||
"faq_q2_point4" = "• Cifra o enruta tu tráfico de internet";
|
"faq_q2_point4" = "• Cifra o enruta tu tráfico de internet";
|
||||||
"faq_q2_a2" = "StosVPN solo crea una interfaz de red local para ayudar a los desarrolladores a conectarse a servicios locales para el desarrollo y las pruebas.";
|
"faq_q2_a2" = "LocalDevVPN solo crea una interfaz de red local para ayudar a los desarrolladores a conectarse a servicios locales para el desarrollo y las pruebas.";
|
||||||
"faq_q3" = "¿Por qué falla la conexión?";
|
"faq_q3" = "¿Por qué falla la conexión?";
|
||||||
"faq_q3_a1" = "Las fallas en la conexión pueden deberse a permisos del sistema, errores de configuración o restricciones de iOS.";
|
"faq_q3_a1" = "Las fallas en la conexión pueden deberse a permisos del sistema, errores de configuración o restricciones de iOS.";
|
||||||
"faq_troubleshoot_header" = "Pasos para solucionar problemas:";
|
"faq_troubleshoot_header" = "Pasos para solucionar problemas:";
|
||||||
@@ -87,15 +87,15 @@
|
|||||||
"faq_troubleshoot3" = "• Verifica si la configuración IP es válida";
|
"faq_troubleshoot3" = "• Verifica si la configuración IP es válida";
|
||||||
"faq_troubleshoot4" = "• Reinicia el dispositivo si los problemas persisten";
|
"faq_troubleshoot4" = "• Reinicia el dispositivo si los problemas persisten";
|
||||||
"faq_q4" = "¿Para quién es esta app?";
|
"faq_q4" = "¿Para quién es esta app?";
|
||||||
"faq_q4_intro" = "StosVPN está diseñado principalmente para:";
|
"faq_q4_intro" = "LocalDevVPN está diseñado principalmente para:";
|
||||||
"faq_q4_case1" = "• Desarrolladores que prueban servidores web locales";
|
"faq_q4_case1" = "• Desarrolladores que prueban servidores web locales";
|
||||||
"faq_q4_case2" = "• Desarrolladores de apps que prueban funcionalidades de red";
|
"faq_q4_case2" = "• Desarrolladores de apps que prueban funcionalidades de red";
|
||||||
"faq_q4_case3" = "• Ingenieros de QA que prueban apps en entornos aislados";
|
"faq_q4_case3" = "• Ingenieros de QA que prueban apps en entornos aislados";
|
||||||
"faq_q4_case4" = "• Cualquier persona que necesite acceder a servicios locales en iOS";
|
"faq_q4_case4" = "• Cualquier persona que necesite acceder a servicios locales en iOS";
|
||||||
"faq_q4_conclusion" = "Esta app está disponible para el público y es útil para desarrolladores que necesitan probar apps con funcionalidades de red en iOS.";
|
"faq_q4_conclusion" = "Esta app está disponible para el público y es útil para desarrolladores que necesitan probar apps con funcionalidades de red en iOS.";
|
||||||
"business_model_header" = "Modelo de Negocio";
|
"business_model_header" = "Modelo de Negocio";
|
||||||
"biz_q1" = "¿Cómo funciona StosVPN?";
|
"biz_q1" = "¿Cómo funciona LocalDevVPN?";
|
||||||
"biz_q1_a1" = "StosVPN es una app completamente gratuita disponible para el público. No hay funciones de pago, suscripciones ni compras dentro de la app.";
|
"biz_q1_a1" = "LocalDevVPN es una app completamente gratuita disponible para el público. No hay funciones de pago, suscripciones ni compras dentro de la app.";
|
||||||
"biz_key_points_header" = "Puntos clave de nuestro modelo:";
|
"biz_key_points_header" = "Puntos clave de nuestro modelo:";
|
||||||
"biz_point1" = "• La app no está vinculada a ninguna empresa o grupo";
|
"biz_point1" = "• La app no está vinculada a ninguna empresa o grupo";
|
||||||
"biz_point2" = "• Cualquier persona puede descargar y usar la app desde la App Store";
|
"biz_point2" = "• Cualquier persona puede descargar y usar la app desde la App Store";
|
||||||
@@ -106,18 +106,18 @@
|
|||||||
"requires_ios" = "Requiere iOS 14.0 o superior";
|
"requires_ios" = "Requiere iOS 14.0 o superior";
|
||||||
"uses_network_extension" = "Usa la API de Extensión de Red de Apple";
|
"uses_network_extension" = "Usa la API de Extensión de Red de Apple";
|
||||||
"help_and_support_nav" = "Ayuda & Soporte";
|
"help_and_support_nav" = "Ayuda & Soporte";
|
||||||
"setup_welcome_title" = "Bienvenido a StosVPN";
|
"setup_welcome_title" = "Bienvenido a LocalDevVPN";
|
||||||
"setup_welcome_description" = "Un simple túnel de red local para desarrolladores";
|
"setup_welcome_description" = "Un simple túnel de red local para desarrolladores";
|
||||||
"setup_welcome_details" = "StosVPN crea una interfaz de red local para el desarrollo, pruebas y acceso a servidores locales. Esta app NO recopila datos de usuario ni enruta el tráfico a través de servidores externos.";
|
"setup_welcome_details" = "LocalDevVPN crea una interfaz de red local para el desarrollo, pruebas y acceso a servidores locales. Esta app NO recopila datos de usuario ni enruta el tráfico a través de servidores externos.";
|
||||||
"setup_why_title" = "¿Por qué usar StosVPN?";
|
"setup_why_title" = "¿Por qué usar LocalDevVPN?";
|
||||||
"setup_why_description" = "Ideal para desarrolladores iOS";
|
"setup_why_description" = "Ideal para desarrolladores iOS";
|
||||||
"setup_why_details" = "• Accede a servidores web locales y entornos de desarrollo\n• Prueba apps que requieren configuraciones de red específicas\n• Conéctate a servicios de red locales sin configuraciones complejas\n• Crea entornos aislados para pruebas";
|
"setup_why_details" = "• Accede a servidores web locales y entornos de desarrollo\n• Prueba apps que requieren configuraciones de red específicas\n• Conéctate a servicios de red locales sin configuraciones complejas\n• Crea entornos aislados para pruebas";
|
||||||
"setup_easy_title" = "Fácil de Usar";
|
"setup_easy_title" = "Fácil de Usar";
|
||||||
"setup_easy_description" = "Conéctate con solo un toque";
|
"setup_easy_description" = "Conéctate con solo un toque";
|
||||||
"setup_easy_details" = "StosVPN está diseñado para ser simple. Solo toca el botón de conexión para establecer un túnel local con configuraciones predefinidas.";
|
"setup_easy_details" = "LocalDevVPN está diseñado para ser simple. Solo toca el botón de conexión para establecer un túnel local con configuraciones predefinidas.";
|
||||||
"setup_privacy_title" = "Enfocado en la Privacidad";
|
"setup_privacy_title" = "Enfocado en la Privacidad";
|
||||||
"setup_privacy_description" = "Tus datos permanecen en tu dispositivo";
|
"setup_privacy_description" = "Tus datos permanecen en tu dispositivo";
|
||||||
"setup_privacy_details" = "StosVPN crea un túnel local que no enruta el tráfico a través de servidores externos. Todo el tráfico permanece en tu dispositivo, asegurando privacidad y seguridad. Ningún dato se recopila ni se comparte con terceros.";
|
"setup_privacy_details" = "LocalDevVPN crea un túnel local que no enruta el tráfico a través de servidores externos. Todo el tráfico permanece en tu dispositivo, asegurando privacidad y seguridad. Ningún dato se recopila ni se comparte con terceros.";
|
||||||
"setup_nav" = "Configuración";
|
"setup_nav" = "Configuración";
|
||||||
"setup_get_started" = "Comenzar";
|
"setup_get_started" = "Comenzar";
|
||||||
"setup_next" = "Siguiente";
|
"setup_next" = "Siguiente";
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"disconnect" = "Disconnetti";
|
"disconnect" = "Disconnetti";
|
||||||
"connecting_ellipsis" = "Connessione in corso...";
|
"connecting_ellipsis" = "Connessione in corso...";
|
||||||
"disconnecting_ellipsis" = "Disconnessione in corso...";
|
"disconnecting_ellipsis" = "Disconnessione in corso...";
|
||||||
"server_address_name" = "Tunnel Locale di StosVPN";
|
"server_address_name" = "Tunnel Locale di LocalDevVPN";
|
||||||
|
|
||||||
"local_tunnel_details" = "Dettagli del Tunnel";
|
"local_tunnel_details" = "Dettagli del Tunnel";
|
||||||
"time_connected" = "Tempo Connesso";
|
"time_connected" = "Tempo Connesso";
|
||||||
@@ -53,32 +53,32 @@
|
|||||||
|
|
||||||
"data_collection_policy_title" = "Politica di Raccolta Dati";
|
"data_collection_policy_title" = "Politica di Raccolta Dati";
|
||||||
"no_data_collection" = "Nessuna raccolta di dati";
|
"no_data_collection" = "Nessuna raccolta di dati";
|
||||||
"no_data_collection_description" = "StosVPN NON raccoglie dati utente, informazioni sul traffico o attività di navigazione. Questa app crea un tunnel di rete locale che rimane interamente sul tuo dispositivo.";
|
"no_data_collection_description" = "LocalDevVPN NON raccoglie dati utente, informazioni sul traffico o attività di navigazione. Questa app crea un tunnel di rete locale che rimane interamente sul tuo dispositivo.";
|
||||||
"local_processing_only" = "Elaborazione solo sul tuo smartphone";
|
"local_processing_only" = "Elaborazione solo sul tuo smartphone";
|
||||||
"local_processing_only_description" = "Tutto il traffico di rete e le configurazioni vengono elaborate localmente sul tuo dispositivo. Nessuna informazione lascia mai il dispositivo o viene trasmessa su Internet.";
|
"local_processing_only_description" = "Tutto il traffico di rete e le configurazioni vengono elaborate localmente sul tuo dispositivo. Nessuna informazione lascia mai il dispositivo o viene trasmessa su Internet.";
|
||||||
"no_third_party_sharing" = "Nessuna condivisione con servizi di terze parti";
|
"no_third_party_sharing" = "Nessuna condivisione con servizi di terze parti";
|
||||||
"no_third_party_sharing_description" = "Poiché non raccogliamo dati, non c'è alcuna condivisione con terze parti. Non abbiamo analisi, tracciamento o meccanismi di raccolta dati in questa app.";
|
"no_third_party_sharing_description" = "Poiché non raccogliamo dati, non c'è alcuna condivisione con terze parti. Non abbiamo analisi, tracciamento o meccanismi di raccolta dati in questa app.";
|
||||||
"why_use_network_permissions" = "Perché concedere i permessi di Rete?";
|
"why_use_network_permissions" = "Perché concedere i permessi di Rete?";
|
||||||
"why_use_network_permissions_description" = "StosVPN richiede permessi di estensione di rete per creare un'interfaccia di rete locale sul tuo dispositivo. Questo è utilizzato esclusivamente per sviluppo e test locali sul tuo dispositivo.";
|
"why_use_network_permissions_description" = "LocalDevVPN richiede permessi di estensione di rete per creare un'interfaccia di rete locale sul tuo dispositivo. Questo è utilizzato esclusivamente per sviluppo e test locali sul tuo dispositivo.";
|
||||||
"our_promise" = "La nostra promessa";
|
"our_promise" = "La nostra promessa";
|
||||||
"our_promise_description" = "Ci impegniamo per la privacy e la trasparenza. Questa app è progettata per sviluppatori per testare e connettersi a server locali senza preoccupazioni sulla privacy.";
|
"our_promise_description" = "Ci impegniamo per la privacy e la trasparenza. Questa app è progettata per sviluppatori per testare e connettersi a server locali senza preoccupazioni sulla privacy.";
|
||||||
"data_collection_policy_nav" = "Raccolta Dati";
|
"data_collection_policy_nav" = "Raccolta Dati";
|
||||||
"logs_nav" = "Log di connessione";
|
"logs_nav" = "Log di connessione";
|
||||||
"faq_header" = "Domande Frequenti";
|
"faq_header" = "Domande Frequenti";
|
||||||
"faq_q1" = "Cosa fa questa app?";
|
"faq_q1" = "Cosa fa questa app?";
|
||||||
"faq_q1_a1" = "StosVPN crea un'interfaccia di rete locale utilizzabile per sviluppo e test. Non instrada il traffico attraverso server esterni, tutto rimane sul dispositivo.";
|
"faq_q1_a1" = "LocalDevVPN crea un'interfaccia di rete locale utilizzabile per sviluppo e test. Non instrada il traffico attraverso server esterni, tutto rimane sul dispositivo.";
|
||||||
"faq_common_use_cases" = "I casi d'uso comuni includono:";
|
"faq_common_use_cases" = "I casi d'uso comuni includono:";
|
||||||
"faq_case1" = "• Test di applicazioni web con server locali.";
|
"faq_case1" = "• Test di applicazioni web con server locali.";
|
||||||
"faq_case2" = "• Sviluppo e Debug di funzionalità di rete.";
|
"faq_case2" = "• Sviluppo e Debug di funzionalità di rete.";
|
||||||
"faq_case3" = "• Accesso ad ambienti di sviluppo locali ospitati.";
|
"faq_case3" = "• Accesso ad ambienti di sviluppo locali ospitati.";
|
||||||
"faq_case4" = "• Test di applicazioni che richiedono configurazioni di rete specifiche.";
|
"faq_case4" = "• Test di applicazioni che richiedono configurazioni di rete specifiche.";
|
||||||
"faq_q2" = "È un VPN tradizionale?";
|
"faq_q2" = "È un VPN tradizionale?";
|
||||||
"faq_q2_a1" = "No, StosVPN NON è un servizio VPN tradizionale. Non:";
|
"faq_q2_a1" = "No, LocalDevVPN NON è un servizio VPN tradizionale. Non:";
|
||||||
"faq_q2_point1" = "• Instrada il tuo traffico attraverso server esterni.";
|
"faq_q2_point1" = "• Instrada il tuo traffico attraverso server esterni.";
|
||||||
"faq_q2_point2" = "• Garantisce privacy e la navigazione in incognito.";
|
"faq_q2_point2" = "• Garantisce privacy e la navigazione in incognito.";
|
||||||
"faq_q2_point3" = "• Esegue connessioni a server VPN remoti.";
|
"faq_q2_point3" = "• Esegue connessioni a server VPN remoti.";
|
||||||
"faq_q2_point4" = "• Cripta o instrada il tuo traffico internet.";
|
"faq_q2_point4" = "• Cripta o instrada il tuo traffico internet.";
|
||||||
"faq_q2_a2" = "StosVPN crea solo un'interfaccia di rete locale per aiutare gli sviluppatori a connettersi a servizi locali per lo sviluppo e test.";
|
"faq_q2_a2" = "LocalDevVPN crea solo un'interfaccia di rete locale per aiutare gli sviluppatori a connettersi a servizi locali per lo sviluppo e test.";
|
||||||
"faq_q3" = "Perché non si connette?";
|
"faq_q3" = "Perché non si connette?";
|
||||||
"faq_q3_a1" = "Un errore durante la connessione può essere dovuto a permessi di sistema, errori di configurazione o restrizioni di iOS.";
|
"faq_q3_a1" = "Un errore durante la connessione può essere dovuto a permessi di sistema, errori di configurazione o restrizioni di iOS.";
|
||||||
"faq_troubleshoot_header" = "Passaggi per risolvere:";
|
"faq_troubleshoot_header" = "Passaggi per risolvere:";
|
||||||
@@ -87,15 +87,15 @@
|
|||||||
"faq_troubleshoot3" = "• Verifica se la configurazione IP è valida.";
|
"faq_troubleshoot3" = "• Verifica se la configurazione IP è valida.";
|
||||||
"faq_troubleshoot4" = "• Riavvia il dispositivo se i problemi persistono.";
|
"faq_troubleshoot4" = "• Riavvia il dispositivo se i problemi persistono.";
|
||||||
"faq_q4" = "Per chi è questa app?";
|
"faq_q4" = "Per chi è questa app?";
|
||||||
"faq_q4_intro" = "StosVPN è progettato principalmente per:";
|
"faq_q4_intro" = "LocalDevVPN è progettato principalmente per:";
|
||||||
"faq_q4_case1" = "• Sviluppatori che testano server web locali.";
|
"faq_q4_case1" = "• Sviluppatori che testano server web locali.";
|
||||||
"faq_q4_case2" = "• Sviluppatori app che testano funzionalità di rete.";
|
"faq_q4_case2" = "• Sviluppatori app che testano funzionalità di rete.";
|
||||||
"faq_q4_case3" = "• Ingegneri QA che testano app in ambienti isolati.";
|
"faq_q4_case3" = "• Ingegneri QA che testano app in ambienti isolati.";
|
||||||
"faq_q4_case4" = "• Chiunque necessiti di accedere a servizi locali sull'iOS.";
|
"faq_q4_case4" = "• Chiunque necessiti di accedere a servizi locali sull'iOS.";
|
||||||
"faq_q4_conclusion" = "Questa app è disponibile al pubblico ed è utile per sviluppatori che devono testare app con funzionalità di rete su iOS.";
|
"faq_q4_conclusion" = "Questa app è disponibile al pubblico ed è utile per sviluppatori che devono testare app con funzionalità di rete su iOS.";
|
||||||
"business_model_header" = "Modello di Business";
|
"business_model_header" = "Modello di Business";
|
||||||
"biz_q1" = "Come funziona StosVPN?";
|
"biz_q1" = "Come funziona LocalDevVPN?";
|
||||||
"biz_q1_a1" = "StosVPN è un'app completamente gratuita disponibile al pubblico. Non ci sono funzionalità a pagamento, abbonamenti o acquisti in‑app.";
|
"biz_q1_a1" = "LocalDevVPN è un'app completamente gratuita disponibile al pubblico. Non ci sono funzionalità a pagamento, abbonamenti o acquisti in‑app.";
|
||||||
"biz_key_points_header" = "Punti chiave del nostro modello:";
|
"biz_key_points_header" = "Punti chiave del nostro modello:";
|
||||||
"biz_point1" = "• L'app non è vincolata a nessuna azienda o gruppo.";
|
"biz_point1" = "• L'app non è vincolata a nessuna azienda o gruppo.";
|
||||||
"biz_point2" = "• Chiunque può scaricare e usare l'app dall'App Store.";
|
"biz_point2" = "• Chiunque può scaricare e usare l'app dall'App Store.";
|
||||||
@@ -106,18 +106,18 @@
|
|||||||
"requires_ios" = "Richiede iOS 14.0 o superiore";
|
"requires_ios" = "Richiede iOS 14.0 o superiore";
|
||||||
"uses_network_extension" = "Usa le Network Extension API di Apple";
|
"uses_network_extension" = "Usa le Network Extension API di Apple";
|
||||||
"help_and_support_nav" = "Guida & Supporto";
|
"help_and_support_nav" = "Guida & Supporto";
|
||||||
"setup_welcome_title" = "Benvenuto in StosVPN";
|
"setup_welcome_title" = "Benvenuto in LocalDevVPN";
|
||||||
"setup_welcome_description" = "Un semplice tunnel di rete locale per sviluppatori";
|
"setup_welcome_description" = "Un semplice tunnel di rete locale per sviluppatori";
|
||||||
"setup_welcome_details" = "StosVPN crea un'interfaccia di rete locale per sviluppo, test e accesso a server locali. Questa app NON raccoglie dati utente né instrada il traffico attraverso server esterni.";
|
"setup_welcome_details" = "LocalDevVPN crea un'interfaccia di rete locale per sviluppo, test e accesso a server locali. Questa app NON raccoglie dati utente né instrada il traffico attraverso server esterni.";
|
||||||
"setup_why_title" = "Perché Usare StosVPN?";
|
"setup_why_title" = "Perché Usare LocalDevVPN?";
|
||||||
"setup_why_description" = "Perfetto per sviluppatori iOS";
|
"setup_why_description" = "Perfetto per sviluppatori iOS";
|
||||||
"setup_why_details" = "• Accedi a server web locali e ambienti di sviluppo\n• Testa app che richiedono configurazioni di rete specifiche\n• Connettiti a servizi di rete locali senza setup complessi\n• Crea ambienti isolati per test";
|
"setup_why_details" = "• Accedi a server web locali e ambienti di sviluppo\n• Testa app che richiedono configurazioni di rete specifiche\n• Connettiti a servizi di rete locali senza setup complessi\n• Crea ambienti isolati per test";
|
||||||
"setup_easy_title" = "Facile da Usare";
|
"setup_easy_title" = "Facile da Usare";
|
||||||
"setup_easy_description" = "Basta un tap per connettersi";
|
"setup_easy_description" = "Basta un tap per connettersi";
|
||||||
"setup_easy_details" = "StosVPN è progettato per essere semplice. Basta toccare il pulsante di connessione per stabilire un tunnel locale con impostazioni preconfigurate.";
|
"setup_easy_details" = "LocalDevVPN è progettato per essere semplice. Basta toccare il pulsante di connessione per stabilire un tunnel locale con impostazioni preconfigurate.";
|
||||||
"setup_privacy_title" = "Focalizzato sulla Privacy";
|
"setup_privacy_title" = "Focalizzato sulla Privacy";
|
||||||
"setup_privacy_description" = "I tuoi dati restano sul dispositivo";
|
"setup_privacy_description" = "I tuoi dati restano sul dispositivo";
|
||||||
"setup_privacy_details" = "StosVPN crea un tunnel locale che non instrada il traffico attraverso server esterni. Tutto il traffico rimane sul tuo dispositivo, garantendo privacy e sicurezza. Nessun dato viene raccolto o condiviso con terze parti.";
|
"setup_privacy_details" = "LocalDevVPN crea un tunnel locale che non instrada il traffico attraverso server esterni. Tutto il traffico rimane sul tuo dispositivo, garantendo privacy e sicurezza. Nessun dato viene raccolto o condiviso con terze parti.";
|
||||||
"setup_nav" = "Setup";
|
"setup_nav" = "Setup";
|
||||||
"setup_get_started" = "Inizia";
|
"setup_get_started" = "Inizia";
|
||||||
"setup_next" = "Avanti";
|
"setup_next" = "Avanti";
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"disconnect" = "Rozłącz";
|
"disconnect" = "Rozłącz";
|
||||||
"connecting_ellipsis" = "Łączenie...";
|
"connecting_ellipsis" = "Łączenie...";
|
||||||
"disconnecting_ellipsis" = "Rozłączanie...";
|
"disconnecting_ellipsis" = "Rozłączanie...";
|
||||||
"server_address_name" = "Lokalny tunel StosVPN";
|
"server_address_name" = "Lokalny tunel LocalDevVPN";
|
||||||
|
|
||||||
"local_tunnel_details" = "Szczegóły tunelu";
|
"local_tunnel_details" = "Szczegóły tunelu";
|
||||||
"time_connected" = "Czas połączenia";
|
"time_connected" = "Czas połączenia";
|
||||||
@@ -54,32 +54,32 @@
|
|||||||
"understand_button" = "Rozumiem";
|
"understand_button" = "Rozumiem";
|
||||||
"data_collection_policy_title" = "Polityka zbierania danych";
|
"data_collection_policy_title" = "Polityka zbierania danych";
|
||||||
"no_data_collection" = "Brak zbierania danych";
|
"no_data_collection" = "Brak zbierania danych";
|
||||||
"no_data_collection_description" = "StosVPN NIE zbiera danych użytkownika, informacji o ruchu ani aktywności w przeglądarce. Aplikacja tworzy lokalny tunel sieciowy, który działa wyłącznie na Twoim urządzeniu.";
|
"no_data_collection_description" = "LocalDevVPN NIE zbiera danych użytkownika, informacji o ruchu ani aktywności w przeglądarce. Aplikacja tworzy lokalny tunel sieciowy, który działa wyłącznie na Twoim urządzeniu.";
|
||||||
"local_processing_only" = "Tylko lokalne przetwarzanie";
|
"local_processing_only" = "Tylko lokalne przetwarzanie";
|
||||||
"local_processing_only_description" = "Cały ruch sieciowy i konfiguracje są przetwarzane lokalnie na Twoim urządzeniu. Żadne informacje nie opuszczają urządzenia ani nie są przesyłane przez Internet.";
|
"local_processing_only_description" = "Cały ruch sieciowy i konfiguracje są przetwarzane lokalnie na Twoim urządzeniu. Żadne informacje nie opuszczają urządzenia ani nie są przesyłane przez Internet.";
|
||||||
"no_third_party_sharing" = "Brak udostępniania osobom trzecim";
|
"no_third_party_sharing" = "Brak udostępniania osobom trzecim";
|
||||||
"no_third_party_sharing_description" = "Ponieważ nie zbieramy danych, nie ma żadnego udostępniania osobom trzecim. Aplikacja nie zawiera analityki, śledzenia ani mechanizmów zbierania danych.";
|
"no_third_party_sharing_description" = "Ponieważ nie zbieramy danych, nie ma żadnego udostępniania osobom trzecim. Aplikacja nie zawiera analityki, śledzenia ani mechanizmów zbierania danych.";
|
||||||
"why_use_network_permissions" = "Dlaczego wymagane są uprawnienia sieciowe";
|
"why_use_network_permissions" = "Dlaczego wymagane są uprawnienia sieciowe";
|
||||||
"why_use_network_permissions_description" = "StosVPN wymaga uprawnień rozszerzenia sieciowego, aby utworzyć lokalny interfejs sieciowy na Twoim urządzeniu. Jest on używany wyłącznie do lokalnego rozwoju i testowania.";
|
"why_use_network_permissions_description" = "LocalDevVPN wymaga uprawnień rozszerzenia sieciowego, aby utworzyć lokalny interfejs sieciowy na Twoim urządzeniu. Jest on używany wyłącznie do lokalnego rozwoju i testowania.";
|
||||||
"our_promise" = "Nasza obietnica";
|
"our_promise" = "Nasza obietnica";
|
||||||
"our_promise_description" = "Zobowiązujemy się do ochrony prywatności i przejrzystości. Ta aplikacja została zaprojektowana z myślą o programistach do testowania i łączenia się z lokalnymi serwerami bez obaw o prywatność.";
|
"our_promise_description" = "Zobowiązujemy się do ochrony prywatności i przejrzystości. Ta aplikacja została zaprojektowana z myślą o programistach do testowania i łączenia się z lokalnymi serwerami bez obaw o prywatność.";
|
||||||
"data_collection_policy_nav" = "Zbieranie danych";
|
"data_collection_policy_nav" = "Zbieranie danych";
|
||||||
"logs_nav" = "Logi";
|
"logs_nav" = "Logi";
|
||||||
"faq_header" = "Najczęściej zadawane pytania";
|
"faq_header" = "Najczęściej zadawane pytania";
|
||||||
"faq_q1" = "Do czego służy ta aplikacja?";
|
"faq_q1" = "Do czego służy ta aplikacja?";
|
||||||
"faq_q1_a1" = "StosVPN tworzy lokalny interfejs sieciowy do celów rozwojowych i testowych. Nie przekierowuje ruchu przez zewnętrzne serwery – wszystko pozostaje na urządzeniu.";
|
"faq_q1_a1" = "LocalDevVPN tworzy lokalny interfejs sieciowy do celów rozwojowych i testowych. Nie przekierowuje ruchu przez zewnętrzne serwery – wszystko pozostaje na urządzeniu.";
|
||||||
"faq_common_use_cases" = "Typowe przypadki użycia:";
|
"faq_common_use_cases" = "Typowe przypadki użycia:";
|
||||||
"faq_case1" = "• Testowanie aplikacji webowych z lokalnymi serwerami";
|
"faq_case1" = "• Testowanie aplikacji webowych z lokalnymi serwerami";
|
||||||
"faq_case2" = "• Tworzenie i debugowanie funkcji sieciowych";
|
"faq_case2" = "• Tworzenie i debugowanie funkcji sieciowych";
|
||||||
"faq_case3" = "• Dostęp do lokalnych środowisk deweloperskich";
|
"faq_case3" = "• Dostęp do lokalnych środowisk deweloperskich";
|
||||||
"faq_case4" = "• Testowanie aplikacji wymagających określonych konfiguracji sieciowych";
|
"faq_case4" = "• Testowanie aplikacji wymagających określonych konfiguracji sieciowych";
|
||||||
"faq_q2" = "Czy to tradycyjna sieć VPN?";
|
"faq_q2" = "Czy to tradycyjna sieć VPN?";
|
||||||
"faq_q2_a1" = "Nie, StosVPN NIE jest tradycyjną usługą VPN. NIE robi:";
|
"faq_q2_a1" = "Nie, LocalDevVPN NIE jest tradycyjną usługą VPN. NIE robi:";
|
||||||
"faq_q2_point1" = "• Przekierowywania ruchu przez zewnętrzne serwery";
|
"faq_q2_point1" = "• Przekierowywania ruchu przez zewnętrzne serwery";
|
||||||
"faq_q2_point2" = "• Zapewnienia prywatności lub anonimowości przeglądania";
|
"faq_q2_point2" = "• Zapewnienia prywatności lub anonimowości przeglądania";
|
||||||
"faq_q2_point3" = "• Łączenia z zewnętrznymi serwerami VPN";
|
"faq_q2_point3" = "• Łączenia z zewnętrznymi serwerami VPN";
|
||||||
"faq_q2_point4" = "• Szyfrowania lub przekierowywania Twojego ruchu internetowego";
|
"faq_q2_point4" = "• Szyfrowania lub przekierowywania Twojego ruchu internetowego";
|
||||||
"faq_q2_a2" = "StosVPN jedynie tworzy lokalny interfejs sieciowy, aby pomóc programistom łączyć się z lokalnymi usługami w celu rozwoju i testowania.";
|
"faq_q2_a2" = "LocalDevVPN jedynie tworzy lokalny interfejs sieciowy, aby pomóc programistom łączyć się z lokalnymi usługami w celu rozwoju i testowania.";
|
||||||
"faq_q3" = "Dlaczego połączenie się nie udaje?";
|
"faq_q3" = "Dlaczego połączenie się nie udaje?";
|
||||||
"faq_q3_a1" = "Nieudane połączenia mogą wynikać z braku uprawnień systemowych, błędów konfiguracji lub ograniczeń iOS.";
|
"faq_q3_a1" = "Nieudane połączenia mogą wynikać z braku uprawnień systemowych, błędów konfiguracji lub ograniczeń iOS.";
|
||||||
"faq_troubleshoot_header" = "Kroki rozwiązywania problemów:";
|
"faq_troubleshoot_header" = "Kroki rozwiązywania problemów:";
|
||||||
@@ -88,15 +88,15 @@
|
|||||||
"faq_troubleshoot3" = "• Sprawdź, czy konfiguracja IP jest prawidłowa";
|
"faq_troubleshoot3" = "• Sprawdź, czy konfiguracja IP jest prawidłowa";
|
||||||
"faq_troubleshoot4" = "• Uruchom ponownie urządzenie, jeśli problemy będą się powtarzać";
|
"faq_troubleshoot4" = "• Uruchom ponownie urządzenie, jeśli problemy będą się powtarzać";
|
||||||
"faq_q4" = "Dla kogo jest ta aplikacja?";
|
"faq_q4" = "Dla kogo jest ta aplikacja?";
|
||||||
"faq_q4_intro" = "StosVPN został zaprojektowany głównie dla:";
|
"faq_q4_intro" = "LocalDevVPN został zaprojektowany głównie dla:";
|
||||||
"faq_q4_case1" = "• Programistów testujących lokalne serwery webowe";
|
"faq_q4_case1" = "• Programistów testujących lokalne serwery webowe";
|
||||||
"faq_q4_case2" = "• Twórców aplikacji testujących funkcje sieciowe";
|
"faq_q4_case2" = "• Twórców aplikacji testujących funkcje sieciowe";
|
||||||
"faq_q4_case3" = "• Inżynierów QA testujących aplikacje w izolowanych środowiskach";
|
"faq_q4_case3" = "• Inżynierów QA testujących aplikacje w izolowanych środowiskach";
|
||||||
"faq_q4_case4" = "• Każdego, kto potrzebuje dostępu do lokalnych usług na iOS";
|
"faq_q4_case4" = "• Każdego, kto potrzebuje dostępu do lokalnych usług na iOS";
|
||||||
"faq_q4_conclusion" = "Aplikacja jest publicznie dostępna i przydatna dla deweloperów testujących aplikacje z funkcjami sieciowymi na iOS.";
|
"faq_q4_conclusion" = "Aplikacja jest publicznie dostępna i przydatna dla deweloperów testujących aplikacje z funkcjami sieciowymi na iOS.";
|
||||||
"business_model_header" = "Model biznesowy";
|
"business_model_header" = "Model biznesowy";
|
||||||
"biz_q1" = "Jak działa StosVPN?";
|
"biz_q1" = "Jak działa LocalDevVPN?";
|
||||||
"biz_q1_a1" = "StosVPN to całkowicie darmowa aplikacja dostępna publicznie. Nie ma żadnych płatnych funkcji, subskrypcji ani zakupów w aplikacji.";
|
"biz_q1_a1" = "LocalDevVPN to całkowicie darmowa aplikacja dostępna publicznie. Nie ma żadnych płatnych funkcji, subskrypcji ani zakupów w aplikacji.";
|
||||||
"biz_key_points_header" = "Kluczowe cechy naszego modelu:";
|
"biz_key_points_header" = "Kluczowe cechy naszego modelu:";
|
||||||
"biz_point1" = "• Aplikacja nie jest powiązana z żadną firmą ani organizacją";
|
"biz_point1" = "• Aplikacja nie jest powiązana z żadną firmą ani organizacją";
|
||||||
"biz_point2" = "• Każdy może pobrać i używać aplikacji z App Store";
|
"biz_point2" = "• Każdy może pobrać i używać aplikacji z App Store";
|
||||||
@@ -107,18 +107,18 @@
|
|||||||
"requires_ios" = "Wymaga iOS 14.0 lub nowszego";
|
"requires_ios" = "Wymaga iOS 14.0 lub nowszego";
|
||||||
"uses_network_extension" = "Wykorzystuje API Apple Network Extension";
|
"uses_network_extension" = "Wykorzystuje API Apple Network Extension";
|
||||||
"help_and_support_nav" = "Pomoc i wsparcie";
|
"help_and_support_nav" = "Pomoc i wsparcie";
|
||||||
"setup_welcome_title" = "Witamy w StosVPN";
|
"setup_welcome_title" = "Witamy w LocalDevVPN";
|
||||||
"setup_welcome_description" = "Prosty lokalny tunel sieciowy dla programistów";
|
"setup_welcome_description" = "Prosty lokalny tunel sieciowy dla programistów";
|
||||||
"setup_welcome_details" = "StosVPN tworzy lokalny interfejs sieciowy do rozwoju, testowania i dostępu do lokalnych serwerów. Aplikacja NIE zbiera danych użytkownika ani nie przekierowuje ruchu przez zewnętrzne serwery.";
|
"setup_welcome_details" = "LocalDevVPN tworzy lokalny interfejs sieciowy do rozwoju, testowania i dostępu do lokalnych serwerów. Aplikacja NIE zbiera danych użytkownika ani nie przekierowuje ruchu przez zewnętrzne serwery.";
|
||||||
"setup_why_title" = "Dlaczego warto używać StosVPN?";
|
"setup_why_title" = "Dlaczego warto używać LocalDevVPN?";
|
||||||
"setup_why_description" = "Idealny dla programistów iOS";
|
"setup_why_description" = "Idealny dla programistów iOS";
|
||||||
"setup_why_details" = "• Dostęp do lokalnych serwerów webowych i środowisk deweloperskich\n• Testowanie aplikacji wymagających określonych konfiguracji sieci\n• Łączenie z lokalnymi usługami sieciowymi bez skomplikowanej konfiguracji\n• Tworzenie izolowanych środowisk testowych";
|
"setup_why_details" = "• Dostęp do lokalnych serwerów webowych i środowisk deweloperskich\n• Testowanie aplikacji wymagających określonych konfiguracji sieci\n• Łączenie z lokalnymi usługami sieciowymi bez skomplikowanej konfiguracji\n• Tworzenie izolowanych środowisk testowych";
|
||||||
"setup_easy_title" = "Łatwy w użyciu";
|
"setup_easy_title" = "Łatwy w użyciu";
|
||||||
"setup_easy_description" = "Połączenie za pomocą jednego kliknięcia";
|
"setup_easy_description" = "Połączenie za pomocą jednego kliknięcia";
|
||||||
"setup_easy_details" = "StosVPN został zaprojektowany z myślą o prostocie. Wystarczy kliknąć przycisk połączenia, aby ustanowić lokalny tunel z gotową konfiguracją.";
|
"setup_easy_details" = "LocalDevVPN został zaprojektowany z myślą o prostocie. Wystarczy kliknąć przycisk połączenia, aby ustanowić lokalny tunel z gotową konfiguracją.";
|
||||||
"setup_privacy_title" = "Skoncentrowany na prywatności";
|
"setup_privacy_title" = "Skoncentrowany na prywatności";
|
||||||
"setup_privacy_description" = "Twoje dane pozostają na urządzeniu";
|
"setup_privacy_description" = "Twoje dane pozostają na urządzeniu";
|
||||||
"setup_privacy_details" = "StosVPN tworzy lokalny tunel, który nie przekierowuje ruchu przez zewnętrzne serwery. Cały ruch pozostaje na Twoim urządzeniu, zapewniając prywatność i bezpieczeństwo. Żadne dane nie są zbierane ani udostępniane osobom trzecim.";
|
"setup_privacy_details" = "LocalDevVPN tworzy lokalny tunel, który nie przekierowuje ruchu przez zewnętrzne serwery. Cały ruch pozostaje na Twoim urządzeniu, zapewniając prywatność i bezpieczeństwo. Żadne dane nie są zbierane ani udostępniane osobom trzecim.";
|
||||||
"setup_nav" = "Konfiguracja";
|
"setup_nav" = "Konfiguracja";
|
||||||
"setup_get_started" = "Zaczynamy";
|
"setup_get_started" = "Zaczynamy";
|
||||||
"setup_next" = "Dalej";
|
"setup_next" = "Dalej";
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//
|
//
|
||||||
// StosVPNApp.swift
|
// StosVPNApp.swift
|
||||||
// StosVPN
|
// LocalDevVPN
|
||||||
//
|
//
|
||||||
// Created by Stossy11 on 28/03/2025.
|
// Created by Stossy11 on 28/03/2025.
|
||||||
//
|
//
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
@main
|
@main
|
||||||
struct StosVPNApp: App {
|
struct LocalDevVPNApp: App {
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup {
|
WindowGroup {
|
||||||
ContentView()
|
ContentView()
|
||||||