tvOS app icon, Proper Liquid Glass App icon

This commit is contained in:
Stossy11
2025-11-19 12:30:04 +11:00
parent a8e60f27b2
commit bdec8bfef4
36 changed files with 288 additions and 1 deletions

View File

@@ -0,0 +1,3 @@
<svg width="674" height="674" viewBox="0 0 674 674" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M605 0C643.108 3.92999e-06 674 30.8924 674 69V605C674 643.108 643.108 674 605 674H414V593H439L520 376.5C521.833 372.333 526.4 363 530 359C534.5 354 537 346.5 537 341C537 335.529 532.547 311.258 470 294.27V149C470 140.714 467.198 133.084 462.494 127H382.506C377.802 133.084 375 140.714 375 149V275.253C350.381 273.121 325.624 273.092 301 275.167V149C301 140.714 298.198 133.084 293.494 127H213.506C208.802 133.084 206 140.714 206 149V294L204.522 294.399C142.43 311.381 138 335.543 138 341C138 346.5 140.5 354 145 359C148.6 363 153.167 372.333 155 376.5L237 593H262V674H69C30.8924 674 0 643.108 0 605V69C3.9305e-06 30.8924 30.8924 0 69 0H605Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 773 B

34
AppIcon.icon/icon.json Normal file
View File

@@ -0,0 +1,34 @@
{
"fill" : {
"automatic-gradient" : "display-p3:0.23889,0.54053,0.96826,1.00000"
},
"groups" : [
{
"layers" : [
{
"image-name" : "StosPlug.svg",
"name" : "StosPlug"
}
],
"shadow" : {
"kind" : "neutral",
"opacity" : 0.5
},
"translucency-specializations" : [
{
"appearance" : "tinted",
"value" : {
"enabled" : true,
"value" : 0.7
}
}
]
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}

View File

@@ -10,6 +10,7 @@
0E6351BE2E18EABA002AF750 /* NavigationBackport in Frameworks */ = {isa = PBXBuildFile; productRef = 0E6351BD2E18EABA002AF750 /* NavigationBackport */; }; 0E6351BE2E18EABA002AF750 /* NavigationBackport in Frameworks */ = {isa = PBXBuildFile; productRef = 0E6351BD2E18EABA002AF750 /* NavigationBackport */; };
4EB3C7712D96715400C1B22C /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EB3C7702D96715400C1B22C /* NetworkExtension.framework */; }; 4EB3C7712D96715400C1B22C /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EB3C7702D96715400C1B22C /* NetworkExtension.framework */; };
4EB3C7792D96715400C1B22C /* TunnelProv.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 4EB3C76E2D96715400C1B22C /* TunnelProv.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 4EB3C7792D96715400C1B22C /* TunnelProv.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 4EB3C76E2D96715400C1B22C /* TunnelProv.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
4EE6B99B2E8F756700E30694 /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 4EE6B99A2E8F756700E30694 /* AppIcon.icon */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@@ -43,6 +44,7 @@
4EB3C7582D96631A00C1B22C /* StosVPN.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StosVPN.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4EB3C7582D96631A00C1B22C /* StosVPN.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StosVPN.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>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
@@ -90,6 +92,7 @@
4EB3C74F2D96631A00C1B22C = { 4EB3C74F2D96631A00C1B22C = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
4EE6B99A2E8F756700E30694 /* AppIcon.icon */,
0E6351B62E18DF53002AF750 /* Build.xcconfig */, 0E6351B62E18DF53002AF750 /* Build.xcconfig */,
0E6351B72E18DF53002AF750 /* CodeSigning.xcconfig */, 0E6351B72E18DF53002AF750 /* CodeSigning.xcconfig */,
0E6351B82E18DF53002AF750 /* CodeSigning.xcconfig.sample */, 0E6351B82E18DF53002AF750 /* CodeSigning.xcconfig.sample */,
@@ -218,6 +221,7 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
4EE6B99B2E8F756700E30694 /* AppIcon.icon in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -293,6 +297,7 @@
CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME)/$(TARGET_NAME).entitlements"; CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME)/$(TARGET_NAME).entitlements";
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 95J8WZ4TN8;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -369,6 +374,7 @@
CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME)/$(TARGET_NAME).entitlements"; CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME)/$(TARGET_NAME).entitlements";
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 95J8WZ4TN8;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -406,6 +412,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
DEVELOPMENT_ASSET_PATHS = "\"StosVPN/Preview Content\""; DEVELOPMENT_ASSET_PATHS = "\"StosVPN/Preview Content\"";
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -433,6 +440,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
DEVELOPMENT_ASSET_PATHS = "\"StosVPN/Preview Content\""; DEVELOPMENT_ASSET_PATHS = "\"StosVPN/Preview Content\"";
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -457,6 +465,9 @@
4EB3C77C2D96715400C1B22C /* Debug */ = { 4EB3C77C2D96715400C1B22C /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
INFOPLIST_KEY_CFBundleDisplayName = TunnelProv;
INFOPLIST_KEY_NSHumanReadableCopyright = Stossy11;
INFOPLIST_KEY_UIRequiredDeviceCapabilities = arm64;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
@@ -476,6 +487,9 @@
4EB3C77D2D96715400C1B22C /* Release */ = { 4EB3C77D2D96715400C1B22C /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
INFOPLIST_KEY_CFBundleDisplayName = TunnelProv;
INFOPLIST_KEY_NSHumanReadableCopyright = Stossy11;
INFOPLIST_KEY_UIRequiredDeviceCapabilities = arm64;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",

Binary file not shown.

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "1280x768 copy 3.jpeg",
"idiom" : "tv"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,17 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "1280x768.png",
"idiom" : "tv"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "1280x768 copy 3.jpeg",
"idiom" : "tv"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "Content.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "Content@2x.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,17 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
]
}

View File

@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "cool.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "cool 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "Content.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "Content@2x.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,32 @@
{
"assets" : [
{
"filename" : "App Icon - App Store.imagestack",
"idiom" : "tv",
"role" : "primary-app-icon",
"size" : "1280x768"
},
{
"filename" : "AppIcon.imagestack",
"idiom" : "tv",
"role" : "primary-app-icon",
"size" : "400x240"
},
{
"filename" : "Top Shelf Image Wide.imageset",
"idiom" : "tv",
"role" : "top-shelf-image-wide",
"size" : "2320x720"
},
{
"filename" : "Top Shelf Image.imageset",
"idiom" : "tv",
"role" : "top-shelf-image",
"size" : "1920x720"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View File

@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "1280x768 copy 4.jpeg",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "1280x768 copy 4 2.jpeg",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

View File

@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "1280x768 copy 4.jpeg",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "1280x768 copy 5.jpeg",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -118,7 +118,11 @@ class TunnelManager: ObservableObject {
DispatchQueue.main.async { DispatchQueue.main.async {
if let error = error { if let error = error {
VPNLogger.shared.log("Error loading preferences: \(error.localizedDescription)") VPNLogger.shared.log("Error loading preferences: \(error.localizedDescription)")
#if targetEnvironment(simulator)
self.tunnelStatus = .disconnected
#else
self.tunnelStatus = .error self.tunnelStatus = .error
#endif
self.waitingOnSettings = true self.waitingOnSettings = true
return return
} }
@@ -199,7 +203,7 @@ class TunnelManager: ObservableObject {
} }
private func updateTunnelStatus(from connectionStatus: NEVPNStatus) { private func updateTunnelStatus(from connectionStatus: NEVPNStatus) {
let newStatus: TunnelStatus var newStatus: TunnelStatus
switch connectionStatus { switch connectionStatus {
case .invalid, .disconnected: case .invalid, .disconnected:
newStatus = .disconnected newStatus = .disconnected
@@ -215,6 +219,10 @@ class TunnelManager: ObservableObject {
newStatus = .error newStatus = .error
} }
#if targetEnvironment(simulator)
newStatus = .connected
#endif
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 {