diff --git a/Reveil.xcodeproj/project.pbxproj b/Reveil.xcodeproj/project.pbxproj index 2f1e21d..664e3bf 100644 --- a/Reveil.xcodeproj/project.pbxproj +++ b/Reveil.xcodeproj/project.pbxproj @@ -88,7 +88,6 @@ CC21B5332ACD5FB9003EC114 /* OperatingSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B5322ACD5FB9003EC114 /* OperatingSystem.swift */; }; CC21B5352ACD6112003EC114 /* OperatingSystemListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B5342ACD6112003EC114 /* OperatingSystemListView.swift */; }; CC21B5372ACD92B9003EC114 /* GlobalTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B5362ACD92B9003EC114 /* GlobalTimer.swift */; }; - CC21B5392ACD9E2A003EC114 /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B5382ACD9E2A003EC114 /* Delay.swift */; }; CC21B53B2ACDA7E1003EC114 /* CPUInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B53A2ACDA7E1003EC114 /* CPUInformation.swift */; }; CC21B53D2ACDA80F003EC114 /* CPUInformationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B53C2ACDA80F003EC114 /* CPUInformationListView.swift */; }; CC21B53F2ACDAC33003EC114 /* UsageEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B53E2ACDAC33003EC114 /* UsageEntry.swift */; }; @@ -106,6 +105,9 @@ CC21B55B2AD04F84003EC114 /* FileSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B55A2AD04F84003EC114 /* FileSystem.swift */; }; CC21B55D2AD055FC003EC114 /* NetworkInterfacesListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B55C2AD055FC003EC114 /* NetworkInterfacesListView.swift */; }; CC21B55F2AD0586B003EC114 /* NetworkInterfaceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC21B55E2AD0586B003EC114 /* NetworkInterfaceListView.swift */; }; + CC3F94252B4C506B00E67A19 /* View+ListSectionSeparator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC3F94242B4C506B00E67A19 /* View+ListSectionSeparator.swift */; }; + CC3F94272B4C51DD00E67A19 /* View+Material.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC3F94262B4C51DD00E67A19 /* View+Material.swift */; }; + CC3F94292B4C52B000E67A19 /* View+ForegroundStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC3F94282B4C52B000E67A19 /* View+ForegroundStyle.swift */; }; CC4AE2B82ACAA4B400DA23AC /* ReveilApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4AE2B72ACAA4B400DA23AC /* ReveilApp.swift */; }; CC4AE2BA2ACAA4B400DA23AC /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4AE2B92ACAA4B400DA23AC /* ContentView.swift */; }; CC4AE2BC2ACAA4B500DA23AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CC4AE2BB2ACAA4B500DA23AC /* Assets.xcassets */; }; @@ -116,6 +118,7 @@ CC549F072AFA9F1800219CF8 /* EntryUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC549F062AFA9F1800219CF8 /* EntryUpdater.swift */; }; CC5AE1BB2AD1A4420087F082 /* SocketAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5AE1BA2AD1A4420087F082 /* SocketAddress.swift */; }; CC5AE1BF2AD2F2010087F082 /* ifaddrs_safe.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5AE1BE2AD2F2010087F082 /* ifaddrs_safe.swift */; }; + CC7C87942B4C459300B6A639 /* SwiftUIBackports in Frameworks */ = {isa = PBXBuildFile; productRef = CC7C87932B4C459300B6A639 /* SwiftUIBackports */; }; CC7DC2912AF3EB1300D50EDC /* library_stub.h in Headers */ = {isa = PBXBuildFile; fileRef = CC7DC2902AF3EB1300D50EDC /* library_stub.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC7DC29B2AF3EBD600D50EDC /* library_stub.m in Sources */ = {isa = PBXBuildFile; fileRef = CC7DC29A2AF3EBD600D50EDC /* library_stub.m */; }; CC7DC29D2AF3ECA500D50EDC /* library_stub.zip in Resources */ = {isa = PBXBuildFile; fileRef = CC7DC29C2AF3ECA500D50EDC /* library_stub.zip */; }; @@ -273,7 +276,6 @@ CC21B5322ACD5FB9003EC114 /* OperatingSystem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperatingSystem.swift; sourceTree = ""; }; CC21B5342ACD6112003EC114 /* OperatingSystemListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperatingSystemListView.swift; sourceTree = ""; }; CC21B5362ACD92B9003EC114 /* GlobalTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalTimer.swift; sourceTree = ""; }; - CC21B5382ACD9E2A003EC114 /* Delay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Delay.swift; sourceTree = ""; }; CC21B53A2ACDA7E1003EC114 /* CPUInformation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPUInformation.swift; sourceTree = ""; }; CC21B53C2ACDA80F003EC114 /* CPUInformationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPUInformationListView.swift; sourceTree = ""; }; CC21B53E2ACDAC33003EC114 /* UsageEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsageEntry.swift; sourceTree = ""; }; @@ -291,6 +293,9 @@ CC21B55A2AD04F84003EC114 /* FileSystem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileSystem.swift; sourceTree = ""; }; CC21B55C2AD055FC003EC114 /* NetworkInterfacesListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkInterfacesListView.swift; sourceTree = ""; }; CC21B55E2AD0586B003EC114 /* NetworkInterfaceListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkInterfaceListView.swift; sourceTree = ""; }; + CC3F94242B4C506B00E67A19 /* View+ListSectionSeparator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+ListSectionSeparator.swift"; sourceTree = ""; }; + CC3F94262B4C51DD00E67A19 /* View+Material.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Material.swift"; sourceTree = ""; }; + CC3F94282B4C52B000E67A19 /* View+ForegroundStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+ForegroundStyle.swift"; sourceTree = ""; }; CC4AE2B42ACAA4B400DA23AC /* Reveil.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Reveil.app; sourceTree = BUILT_PRODUCTS_DIR; }; CC4AE2B72ACAA4B400DA23AC /* ReveilApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReveilApp.swift; sourceTree = ""; }; CC4AE2B92ACAA4B400DA23AC /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -366,6 +371,7 @@ CCD54D2C2AD9047D007ED1AF /* Collections in Frameworks */, 50E143122B401108000A7191 /* ColorfulX in Frameworks */, CCA0956D2AE8D5E900F5E55F /* UIKit.framework in Frameworks */, + CC7C87942B4C459300B6A639 /* SwiftUIBackports in Frameworks */, CCD54D2E2AD9047D007ED1AF /* DequeModule in Frameworks */, 5024F6EC2B1829EE000CEAB5 /* library_stub.framework in Frameworks */, CCA0956F2AE8D5EE00F5E55F /* SwiftUI.framework in Frameworks */, @@ -464,8 +470,8 @@ CC21B5162ACD459E003EC114 /* Extensions */ = { isa = PBXGroup; children = ( + CC3F94232B4C505600E67A19 /* Backports */, CC549EFD2AFA7DB300219CF8 /* Foundation */, - CC21B5382ACD9E2A003EC114 /* Delay.swift */, CCA095CB2AE8E6D100F5E55F /* Color+Platform.swift */, CC9D249A2B3D954F00A18513 /* URL+Path.swift */, 50E1430F2B400C6F000A7191 /* Brand.swift */, @@ -522,6 +528,16 @@ path = Details; sourceTree = ""; }; + CC3F94232B4C505600E67A19 /* Backports */ = { + isa = PBXGroup; + children = ( + CC3F94242B4C506B00E67A19 /* View+ListSectionSeparator.swift */, + CC3F94262B4C51DD00E67A19 /* View+Material.swift */, + CC3F94282B4C52B000E67A19 /* View+ForegroundStyle.swift */, + ); + path = Backports; + sourceTree = ""; + }; CC4AE2AB2ACAA4B400DA23AC = { isa = PBXGroup; children = ( @@ -811,6 +827,7 @@ 0F08193C2ADAF1C600BB626C /* DictionaryCoder */, CC7DC2A02AF3EEBB00D50EDC /* ZIPFoundation */, 50E143112B401108000A7191 /* ColorfulX */, + CC7C87932B4C459300B6A639 /* SwiftUIBackports */, ); productName = Reveil; productReference = CC4AE2B42ACAA4B400DA23AC /* Reveil.app */; @@ -871,6 +888,7 @@ CC7DC29F2AF3EEBB00D50EDC /* XCRemoteSwiftPackageReference "ZIPFoundation" */, 0FA065832B3D8436000A7ECE /* XCRemoteSwiftPackageReference "swift-argument-parser" */, 50E1430E2B400422000A7191 /* XCRemoteSwiftPackageReference "ColorfulX" */, + CC7C87922B4C459300B6A639 /* XCRemoteSwiftPackageReference "SwiftUIBackports" */, ); productRefGroup = CC4AE2B52ACAA4B400DA23AC /* Products */; projectDirPath = ""; @@ -958,6 +976,7 @@ files = ( 0F4955F92ADAD2F200227265 /* PropertyListRepresentable.swift in Sources */, 50E143102B400C6F000A7191 /* Brand.swift in Sources */, + CC3F94292B4C52B000E67A19 /* View+ForegroundStyle.swift in Sources */, 0FF1CDBF2AD57109004A6D43 /* NetworkUsage.swift in Sources */, CC21B54F2ACF26AD003EC114 /* DiskSpaceListView.swift in Sources */, 0F08193A2ADAEA3400BB626C /* PinStorage.swift in Sources */, @@ -1002,9 +1021,9 @@ CC21B5572AD04EAB003EC114 /* NetworkInterfaces.swift in Sources */, CC21B54D2ACF24E2003EC114 /* DiskSpace.swift in Sources */, 0F2CA1282AE946B200C76A78 /* SecurityView.swift in Sources */, + CC3F94252B4C506B00E67A19 /* View+ListSectionSeparator.swift in Sources */, 0FD0D26C2AE0D39C001DD1E8 /* EntryExporter.swift in Sources */, CC21B4CA2ACAF5DA003EC114 /* CPUActivity.swift in Sources */, - CC21B5392ACD9E2A003EC114 /* Delay.swift in Sources */, CC549F072AFA9F1800219CF8 /* EntryUpdater.swift in Sources */, CC0052642B13458000DBF808 /* BatteryInformation.swift in Sources */, CCA095ED2AED419B00F5E55F /* FishHookChecker.swift in Sources */, @@ -1064,6 +1083,7 @@ CC21B5512ACF2874003EC114 /* FileSystems.swift in Sources */, 0F2CA1262AE6AF8B00C76A78 /* HighlightedEntryKey.swift in Sources */, 0FD0D26A2AE0CD95001DD1E8 /* Dashboard.swift in Sources */, + CC3F94272B4C51DD00E67A19 /* View+Material.swift in Sources */, CC21B4CC2ACAF6FB003EC114 /* MemoryActivity.swift in Sources */, 0FD0D2682AE0CB27001DD1E8 /* Entry.swift in Sources */, 0F4955ED2ADAA0F100227265 /* BasicNumeric.swift in Sources */, @@ -1123,7 +1143,7 @@ ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = 11.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; @@ -1142,7 +1162,7 @@ ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = 11.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_VERSION = 5.0; @@ -1277,7 +1297,7 @@ CODE_SIGN_ENTITLEMENTS = Reveil/Reveil.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = GXZ23M5TP2; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1294,7 +1314,7 @@ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1320,7 +1340,7 @@ CODE_SIGN_ENTITLEMENTS = Reveil/Reveil.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = GXZ23M5TP2; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -1337,7 +1357,7 @@ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1373,7 +1393,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "@executable_path/Frameworks", "@loader_path/Frameworks", @@ -1383,7 +1403,7 @@ "@loader_path/Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = 11.0; MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; @@ -1392,7 +1412,7 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = auto; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -1421,7 +1441,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "@executable_path/Frameworks", "@loader_path/Frameworks", @@ -1431,7 +1451,7 @@ "@loader_path/Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 12.0; + MACOSX_DEPLOYMENT_TARGET = 11.0; MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; @@ -1440,7 +1460,7 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = auto; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; @@ -1516,6 +1536,14 @@ minimumVersion = 2.2.13; }; }; + CC7C87922B4C459300B6A639 /* XCRemoteSwiftPackageReference "SwiftUIBackports" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/shaps80/SwiftUIBackports.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.8.0; + }; + }; CC7DC29F2AF3EEBB00D50EDC /* XCRemoteSwiftPackageReference "ZIPFoundation" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/weichsel/ZIPFoundation.git"; @@ -1550,6 +1578,11 @@ package = 50E1430E2B400422000A7191 /* XCRemoteSwiftPackageReference "ColorfulX" */; productName = ColorfulX; }; + CC7C87932B4C459300B6A639 /* SwiftUIBackports */ = { + isa = XCSwiftPackageProductDependency; + package = CC7C87922B4C459300B6A639 /* XCRemoteSwiftPackageReference "SwiftUIBackports" */; + productName = SwiftUIBackports; + }; CC7DC2A02AF3EEBB00D50EDC /* ZIPFoundation */ = { isa = XCSwiftPackageProductDependency; package = CC7DC29F2AF3EEBB00D50EDC /* XCRemoteSwiftPackageReference "ZIPFoundation" */; diff --git a/Reveil.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Reveil.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b1168d4..c8defbe 100644 --- a/Reveil.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Reveil.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -45,6 +45,24 @@ "version" : "1.0.6" } }, + { + "identity" : "swiftbackports", + "kind" : "remoteSourceControl", + "location" : "https://github.com/shaps80/SwiftBackports", + "state" : { + "revision" : "ddca6a237c1ba2291d5a3cc47ec8480ce6e9f805", + "version" : "1.0.3" + } + }, + { + "identity" : "swiftuibackports", + "kind" : "remoteSourceControl", + "location" : "https://github.com/shaps80/SwiftUIBackports.git", + "state" : { + "revision" : "3042f0cf4b9f0d5b0bb08ad17f742a43bc4fdfc5", + "version" : "2.8.0" + } + }, { "identity" : "zipfoundation", "kind" : "remoteSourceControl", diff --git a/Reveil/ContentView.swift b/Reveil/ContentView.swift index 174f44a..a960964 100644 --- a/Reveil/ContentView.swift +++ b/Reveil/ContentView.swift @@ -6,8 +6,8 @@ // import UIKit - import SwiftUI +import SwiftUIBackports struct ContentView: View { @Environment(\.horizontalSizeClass) private var horizontalSizeClass @@ -67,7 +67,7 @@ struct SidebarView: View { var body: some View { NavigationView { List { - Section(NSLocalizedString("DASHBOARD", comment: "Dashboard")) { + Backport.Section(NSLocalizedString("DASHBOARD", comment: "Dashboard")) { NavigationLink { DashboardView() .navigationTitle(NSLocalizedString("DASHBOARD", comment: "Dashboard")) @@ -77,11 +77,11 @@ struct SidebarView: View { } } - Section(NSLocalizedString("DETAILS", comment: "Details")) { + Backport.Section(NSLocalizedString("DETAILS", comment: "Details")) { DetailsView.createDetailsList() } - Section(NSLocalizedString("ABOUT", comment: "About")) { + Backport.Section(NSLocalizedString("ABOUT", comment: "About")) { NavigationLink { AboutView() .background(ColorfulBackground()) diff --git a/Reveil/Extensions/Backports/View+ForegroundStyle.swift b/Reveil/Extensions/Backports/View+ForegroundStyle.swift new file mode 100644 index 0000000..2dfeca3 --- /dev/null +++ b/Reveil/Extensions/Backports/View+ForegroundStyle.swift @@ -0,0 +1,19 @@ +// +// View+ForegroundStyle.swift +// Reveil +// +// Created by Lessica on 2024/1/8. +// + +import SwiftUI + +extension View { + @ViewBuilder + func foregroundStyle(accent: Bool) -> some View { + if #available(iOS 15.0, *), accent { + self.foregroundStyle(.accent) + } else { + self + } + } +} diff --git a/Reveil/Extensions/Backports/View+ListSectionSeparator.swift b/Reveil/Extensions/Backports/View+ListSectionSeparator.swift new file mode 100644 index 0000000..37aa6c5 --- /dev/null +++ b/Reveil/Extensions/Backports/View+ListSectionSeparator.swift @@ -0,0 +1,37 @@ +// +// View+ListSectionSeparator.swift +// Reveil +// +// Created by Lessica on 2024/1/8. +// + +import SwiftUI + +extension View { + @ViewBuilder + func listSectionSeparator(hidden: Bool = true) -> some View { + if #available(iOS 15.0, *) { + self.listSectionSeparator(hidden ? .hidden : .visible, edges: .all) + } else { + self + } + } + + @ViewBuilder + func listSectionSeparator(topHidden: Bool = true) -> some View { + if #available(iOS 15.0, *) { + self.listSectionSeparator(topHidden ? .hidden : .visible, edges: .top) + } else { + self + } + } + + @ViewBuilder + func listSectionSeparator(bottomHidden: Bool = true) -> some View { + if #available(iOS 15.0, *) { + self.listSectionSeparator(bottomHidden ? .hidden : .visible, edges: .bottom) + } else { + self + } + } +} diff --git a/Reveil/Extensions/Backports/View+Material.swift b/Reveil/Extensions/Backports/View+Material.swift new file mode 100644 index 0000000..7af2511 --- /dev/null +++ b/Reveil/Extensions/Backports/View+Material.swift @@ -0,0 +1,19 @@ +// +// View+Material.swift +// Reveil +// +// Created by Lessica on 2024/1/8. +// + +import SwiftUI + +extension View { + @ViewBuilder + func background(thinMaterial: Bool) -> some View { + if #available(iOS 15.0, *), thinMaterial { + self.background(.thinMaterial) + } else { + self + } + } +} diff --git a/Reveil/Extensions/Delay.swift b/Reveil/Extensions/Delay.swift deleted file mode 100644 index 432e08f..0000000 --- a/Reveil/Extensions/Delay.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// Delay.swift -// Reveil -// -// Created by Lessica on 2023/10/4. -// - -import SwiftUI - -extension TimeInterval { - var nanoseconds: UInt64 { - UInt64((self * 1_000_000_000).rounded()) - } -} - -extension Task where Success == Never, Failure == Never { - static func sleep(_ duration: TimeInterval) async throws { - try await Task.sleep(nanoseconds: duration.nanoseconds) - } -} - -extension View { - func onAppear(delay: TimeInterval, action: @escaping () -> Void) -> some View { - task { - do { - try await Task.sleep(delay) - } catch { // Task canceled - return - } - - await MainActor.run { - action() - } - } - } -} diff --git a/Reveil/Pages/AboutView.swift b/Reveil/Pages/AboutView.swift index 45800f3..c19b5cf 100644 --- a/Reveil/Pages/AboutView.swift +++ b/Reveil/Pages/AboutView.swift @@ -114,7 +114,7 @@ struct AboutView: View { try? data.write(to: tempUrl, options: .atomic) quickLookExport = tempUrl } - .foregroundStyle(.accent) + .foregroundStyle(accent: true) .quickLookPreview($quickLookExport) } .padding() diff --git a/Reveil/Pages/DashboardView.swift b/Reveil/Pages/DashboardView.swift index 75ae7c4..25235e5 100644 --- a/Reveil/Pages/DashboardView.swift +++ b/Reveil/Pages/DashboardView.swift @@ -6,6 +6,7 @@ // import SwiftUI +import SwiftUIBackports struct DashboardView: View { @StateObject private var viewModel = Dashboard.shared @@ -30,14 +31,14 @@ struct DashboardView: View { .foregroundColor(Color(PlatformColor.secondarySystemBackgroundAlias)) .opacity(0.25) ) - .overlay { + .backport.overlay { RoundedRectangle(cornerRadius: 4) .stroke(Color(PlatformColor.separatorAlias), lineWidth: 1) } - .overlay { navigationLinkBuilder(entry) } + .backport.overlay { navigationLinkBuilder(entry) } } .padding(entry === viewModel.entries.last ? .bottom : [], 8) - .listSectionSeparator(.hidden) + .listSectionSeparator(hidden: true) } } .padding() diff --git a/Reveil/Pages/Details/FileSystemsListView.swift b/Reveil/Pages/Details/FileSystemsListView.swift index 20b4163..8dea9b5 100644 --- a/Reveil/Pages/Details/FileSystemsListView.swift +++ b/Reveil/Pages/Details/FileSystemsListView.swift @@ -6,6 +6,7 @@ // import SwiftUI +import SwiftUIBackports struct FileSystemsListView: View, ModuleListView { let module: Module = FileSystems.shared @@ -18,7 +19,7 @@ struct FileSystemsListView: View, ModuleListView { } } - @Environment(\.dismiss) private var dismissAction + @Environment(\.backportDismiss) private var dismissAction @State var items: [FileSystem] = [] @@ -32,7 +33,7 @@ struct FileSystemsListView: View, ModuleListView { } } } - .listSectionSeparator(.hidden) + .listSectionSeparator(hidden: true) } .listStyle(.plain) .frame(maxWidth: .infinity) diff --git a/Reveil/Pages/Details/NetworkDetailsListView.swift b/Reveil/Pages/Details/NetworkDetailsListView.swift index 5e924dc..1a5bd0b 100644 --- a/Reveil/Pages/Details/NetworkDetailsListView.swift +++ b/Reveil/Pages/Details/NetworkDetailsListView.swift @@ -14,7 +14,7 @@ struct NetworkDetailsListView: View, ModuleListView { init?(entryKey _: EntryKey) { nil } - @Environment(\.dismiss) private var dismissAction + @Environment(\.backportDismiss) private var dismissAction @State var items: [NetworkPrefix] = [] @@ -28,7 +28,7 @@ struct NetworkDetailsListView: View, ModuleListView { } } } - .listSectionSeparator(.hidden) + .listSectionSeparator(hidden: true) } .listStyle(.plain) .frame(maxWidth: .infinity) diff --git a/Reveil/Pages/Details/NetworkInterfacesListView.swift b/Reveil/Pages/Details/NetworkInterfacesListView.swift index 340cc67..a4983b4 100644 --- a/Reveil/Pages/Details/NetworkInterfacesListView.swift +++ b/Reveil/Pages/Details/NetworkInterfacesListView.swift @@ -6,6 +6,7 @@ // import SwiftUI +import SwiftUIBackports struct NetworkInterfacesListView: View, ModuleListView { let module: Module = NetworkInterfaces.shared @@ -18,7 +19,7 @@ struct NetworkInterfacesListView: View, ModuleListView { } } - @Environment(\.dismiss) private var dismissAction + @Environment(\.backportDismiss) private var dismissAction @State var items: [NetworkInterface] = [] @@ -32,7 +33,7 @@ struct NetworkInterfacesListView: View, ModuleListView { } } } - .listSectionSeparator(.hidden) + .listSectionSeparator(hidden: true) } .listStyle(.plain) .frame(maxWidth: .infinity) diff --git a/Reveil/Pages/DetailsListView.swift b/Reveil/Pages/DetailsListView.swift index e2ca05c..d3331ad 100644 --- a/Reveil/Pages/DetailsListView.swift +++ b/Reveil/Pages/DetailsListView.swift @@ -6,6 +6,7 @@ // import SwiftUI +import SwiftUIBackports struct DetailsListView: View, FieldCellDelegate { let basicEntries: [BasicEntry] @@ -15,7 +16,7 @@ struct DetailsListView: View, FieldCellDelegate { private let pasteboard = UIPasteboard.general - @Environment(\.dismiss) private var dismissAction + @Environment(\.backportDismiss) private var dismissAction @EnvironmentObject private var highlightedEntryKey: HighlightedEntryKey @State private var selectedEntryKey: EntryKey? @@ -28,7 +29,7 @@ struct DetailsListView: View, FieldCellDelegate { Section { UsageCell(entry: usageEntry, style: usageStyle) } - .listSectionSeparator(.hidden) + .listSectionSeparator(hidden: true) } if let trafficEntries { @@ -43,15 +44,15 @@ struct DetailsListView: View, FieldCellDelegate { .frame(maxWidth: .infinity, alignment: .leading) } } - .listSectionSeparator(.hidden, edges: .top) - .listSectionSeparator(.visible, edges: .bottom) + .listSectionSeparator(topHidden: true) + .listSectionSeparator(bottomHidden: false) } sectionGroupBuilder(basicEntries) } .listStyle(.plain) .frame(maxWidth: .infinity) - .overlay(alignment: .bottom) { toastOverlay() } + .backport.overlay(alignment: .bottom) { toastOverlay() } .onAppear { if let object = highlightedEntryKey.object { selectedEntryKeys.removeAll(keepingCapacity: true) @@ -116,12 +117,12 @@ struct DetailsListView: View, FieldCellDelegate { Section { sectionBuilder(entryGroup.entries) } - .listSectionSeparator(.hidden) + .listSectionSeparator(hidden: true) } else { - Section(entryGroup.title) { + Backport.Section(entryGroup.title) { sectionBuilder(entryGroup.entries) } - .listSectionSeparator(.hidden) + .listSectionSeparator(hidden: true) } } } diff --git a/Reveil/Pages/DetailsView.swift b/Reveil/Pages/DetailsView.swift index 0129f11..84f4e3e 100644 --- a/Reveil/Pages/DetailsView.swift +++ b/Reveil/Pages/DetailsView.swift @@ -61,7 +61,7 @@ struct DetailsView: View { } } } - .listSectionSeparator(.hidden, edges: .top) + .listSectionSeparator(topHidden: true) } var body: some View { @@ -69,7 +69,7 @@ struct DetailsView: View { Self.createDetailsList() } .listStyle(.plain) - .listSectionSeparator(.hidden) + .listSectionSeparator(hidden: true) } } diff --git a/Reveil/Pages/SecurityView.swift b/Reveil/Pages/SecurityView.swift index 2f637b1..50ac2b6 100644 --- a/Reveil/Pages/SecurityView.swift +++ b/Reveil/Pages/SecurityView.swift @@ -6,11 +6,12 @@ // import SwiftUI +import SwiftUIBackports struct SecurityView: View { @StateObject private var securityModel = Security.shared - @Environment(\.dismiss) private var dismissAction + @Environment(\.backportDismiss) private var dismissAction var body: some View { DetailsListView(basicEntries: securityModel.basicEntries) diff --git a/Reveil/Storage/Pin.swift b/Reveil/Storage/Pin.swift index 2948c91..7d2efcc 100644 --- a/Reveil/Storage/Pin.swift +++ b/Reveil/Storage/Pin.swift @@ -13,7 +13,7 @@ struct Pin: PropertyListRepresentable { init(_ isPinned: Bool) { self.isPinned = isPinned - lastChange = Date.now.timeIntervalSinceReferenceDate + lastChange = Date().timeIntervalSinceReferenceDate } init(negate pin: Self) { diff --git a/Reveil/ViewModels/Modules/DeviceInformation.swift b/Reveil/ViewModels/Modules/DeviceInformation.swift index ce085a1..d295e62 100644 --- a/Reveil/ViewModels/Modules/DeviceInformation.swift +++ b/Reveil/ViewModels/Modules/DeviceInformation.swift @@ -41,11 +41,7 @@ final class DeviceInformation: Module { return nil } - let techName: String = if firstValue == CTRadioAccessTechnologyNR { - "5G New Radio (NR)" - } else if firstValue == CTRadioAccessTechnologyNRNSA { - "5G New Radio Non-Standalone (NRNSA)" - } else if firstValue == CTRadioAccessTechnologyLTE { + let techName: String = if firstValue == CTRadioAccessTechnologyLTE { "Long-Term Evolution (LTE)" } else if firstValue == CTRadioAccessTechnologyeHRPD { "Enhanced High Rate Packet Data (eHRPD)" @@ -68,7 +64,18 @@ final class DeviceInformation: Module { } else if firstValue == CTRadioAccessTechnologyGPRS { "General Packet Radio Service (GPRS)" } else { - BasicEntry.unknownValue + if #available(iOS 14.1, *) { + if firstValue == CTRadioAccessTechnologyNR { + "5G New Radio (NR)" + } else if firstValue == CTRadioAccessTechnologyNRNSA { + "5G New Radio Non-Standalone (NRNSA)" + } else { + BasicEntry.unknownValue + } + } else { + // Fallback on earlier versions + BasicEntry.unknownValue + } } return techName diff --git a/Reveil/Views/Dashboard/CheckmarkWidget.swift b/Reveil/Views/Dashboard/CheckmarkWidget.swift index 3530d2f..e1eb4ac 100644 --- a/Reveil/Views/Dashboard/CheckmarkWidget.swift +++ b/Reveil/Views/Dashboard/CheckmarkWidget.swift @@ -7,6 +7,7 @@ import ColorfulX import SwiftUI +import SwiftUIBackports struct CheckmarkWidget: View { @StateObject var securityModel: Security = .shared @@ -98,7 +99,7 @@ struct CheckmarkWidget: View { } .frame(maxWidth: .infinity, alignment: .leading) .padding(.all, 12) - .background { + .backport.background { if usesLegacyStyle { RoundedRectangle(cornerRadius: 4) .foregroundColor(backgroundColor) @@ -109,7 +110,7 @@ struct CheckmarkWidget: View { .clipShape(RoundedRectangle(cornerRadius: 4)) } } - .overlay { + .backport.overlay { if usesLegacyStyle && !isInsecure { RoundedRectangle(cornerRadius: 4) .stroke(Color(PlatformColor.separatorAlias), lineWidth: 1) diff --git a/Reveil/Views/Details/FieldCell.swift b/Reveil/Views/Details/FieldCell.swift index a5b5da0..22b4e92 100644 --- a/Reveil/Views/Details/FieldCell.swift +++ b/Reveil/Views/Details/FieldCell.swift @@ -6,6 +6,7 @@ // import SwiftUI +import SwiftUIBackports private struct FieldCell_Internal: View { let label: String @@ -36,7 +37,7 @@ private struct FieldCell_Internal: View { Text(label) .font(Font.system(.body)) - if isPinnable { + if #available(iOS 15.0, *), isPinnable { Menu { if pin.isPinned { Button { @@ -59,6 +60,8 @@ private struct FieldCell_Internal: View { } primaryAction: { pin = Pin(negate: pin) } + } else { + // Fallback on earlier versions } } diff --git a/Reveil/Views/Details/ToastView.swift b/Reveil/Views/Details/ToastView.swift index 04bbe2f..cd76467 100644 --- a/Reveil/Views/Details/ToastView.swift +++ b/Reveil/Views/Details/ToastView.swift @@ -6,6 +6,7 @@ // import SwiftUI +import SwiftUIBackports struct ToastView: View { let label: String @@ -21,7 +22,7 @@ struct ToastView: View { } .padding() .frame(maxWidth: .infinity, alignment: .leading) - .background(.thinMaterial) + .background(thinMaterial: true) .cornerRadius(8) } .padding() diff --git a/library-stub/library_stub.m b/library-stub/library_stub.m index b7cfab8..b456780 100644 --- a/library-stub/library_stub.m +++ b/library-stub/library_stub.m @@ -63,8 +63,14 @@ BOOL isCdHashInTrustCache(NSData *cdHash) if (amfiServiceDict) { io_connect_t connect; - io_service_t amfiService = IOServiceGetMatchingService(kIOMainPortDefault, amfiServiceDict); - kr = IOServiceOpen(amfiService, mach_task_self(), 0, &connect); + if (@available(iOS 15.0, *)) { + io_service_t amfiService = IOServiceGetMatchingService(kIOMainPortDefault, amfiServiceDict); + kr = IOServiceOpen(amfiService, mach_task_self(), 0, &connect); + } else { + // Fallback on earlier versions + io_service_t amfiService = IOServiceGetMatchingService(0 /* kIOMasterPortDefault */, amfiServiceDict); + kr = IOServiceOpen(amfiService, mach_task_self(), 0, &connect); + } if (kr != KERN_SUCCESS) { NSLog(@"Failed to open amfi service %d %s", kr, mach_error_string(kr));