Skip to content

Commit 733894e

Browse files
committed
📱 iOS 26: Complete app upgrade to Liquid Glass
## Full iOS 26 Upgrade (December 2025) All Swift files now use iOS 26 / Xcode 26 patterns: ### HistoryView.swift - @observable ViewModel (replaces ObservableObject) - MeshGradient.liquidGlassBackground - Glass filter chips with sensory feedback - Glass history rows with score badges - Symbol effects on empty state ### SettingsView.swift - Custom SettingsToggle with symbol effects - 'Reduce Liquid Glass' setting - iOS 26 badge in credits - MeshGradient background ### OnboardingView.swift - 4th page about Liquid Glass design - Glass icon containers with outer glow - Capsule page indicators - Enhanced transitions ### DetailSheet.swift - ShareLink (iOS 15+) - Score breakdown with glass styling - URL details with textSelection - Liquid Glass buttons ### ResultCard.swift - ultraThinMaterial background - Gradient borders with theme color - Animated score bar - Expandable flags ### QRShieldApp.swift - Transparent nav/tab bars - UIBlurEffect integration - Liquid Glass system styling ### Info.plist - MinimumOSVersion: 26.0 - UIObservationTrackingEnabled: true - Privacy manifest entries - Build version: 26
1 parent 9a08236 commit 733894e

7 files changed

Lines changed: 753 additions & 354 deletions

File tree

‎iosApp/QRShield/App/QRShieldApp.swift‎

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
// App/QRShieldApp.swift
2-
// QR-SHIELD iOS Application Entry Point - iOS 18+ / Swift 6
2+
// QR-SHIELD iOS Application - iOS 26 Liquid Glass Edition
33
//
4-
// UPDATED: December 2024
5-
// - Modern app lifecycle handling
6-
// - iOS 18 scene configuration
7-
// - Proper privacy manifest compliance
4+
// UPDATED: December 2025 - iOS 26 / Xcode 26
5+
// - Liquid Glass system integration
6+
// - Modern app lifecycle
7+
// - Enhanced tab bar styling
88

99
import SwiftUI
1010

1111
@main
1212
struct QRShieldApp: App {
13-
// iOS 17+: Use @State for app-level observable state
1413
@State private var hasCompletedOnboarding = UserDefaults.standard.bool(forKey: "hasCompletedOnboarding")
1514

1615
init() {
@@ -34,10 +33,12 @@ struct QRShieldApp: App {
3433
}
3534

3635
private func configureAppearance() {
37-
// Navigation bar styling
36+
// iOS 26: Liquid Glass navigation bar
3837
let navAppearance = UINavigationBarAppearance()
39-
navAppearance.configureWithOpaqueBackground()
40-
navAppearance.backgroundColor = UIColor(Color.bgDark)
38+
navAppearance.configureWithTransparentBackground()
39+
navAppearance.backgroundEffect = UIBlurEffect(style: .systemUltraThinMaterialDark)
40+
navAppearance.backgroundColor = UIColor(Color.bgDark.opacity(0.5))
41+
4142
navAppearance.titleTextAttributes = [
4243
.foregroundColor: UIColor.white,
4344
.font: UIFont.systemFont(ofSize: 17, weight: .semibold)
@@ -52,12 +53,13 @@ struct QRShieldApp: App {
5253
UINavigationBar.appearance().compactAppearance = navAppearance
5354
UINavigationBar.appearance().tintColor = UIColor(Color.brandPrimary)
5455

55-
// Tab bar styling
56+
// iOS 26: Liquid Glass tab bar
5657
let tabAppearance = UITabBarAppearance()
57-
tabAppearance.configureWithOpaqueBackground()
58-
tabAppearance.backgroundColor = UIColor(Color.bgDark)
58+
tabAppearance.configureWithTransparentBackground()
59+
tabAppearance.backgroundEffect = UIBlurEffect(style: .systemUltraThinMaterialDark)
60+
tabAppearance.backgroundColor = UIColor(Color.bgDark.opacity(0.5))
5961

60-
// iOS 18: Enhanced tab bar item appearance
62+
// Tab bar item styling
6163
let itemAppearance = UITabBarItemAppearance()
6264
itemAppearance.normal.iconColor = UIColor.gray
6365
itemAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.gray]
@@ -70,15 +72,10 @@ struct QRShieldApp: App {
7072

7173
UITabBar.appearance().standardAppearance = tabAppearance
7274
UITabBar.appearance().scrollEdgeAppearance = tabAppearance
73-
74-
// Sheet presentation styling
75-
if #available(iOS 16.4, *) {
76-
// Configure default sheet detent
77-
}
7875
}
7976
}
8077

81-
// MARK: - Root Content View
78+
// MARK: - Root Content View (iOS 26)
8279

8380
struct ContentView: View {
8481
@State private var selectedTab = 0
@@ -113,7 +110,6 @@ struct ContentView: View {
113110
.tag(2)
114111
}
115112
.tint(.brandPrimary)
116-
// iOS 18: Add sensory feedback for tab changes
117113
.sensoryFeedback(.selection, trigger: selectedTab)
118114
}
119115
}

‎iosApp/QRShield/Info.plist‎

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@
2020
<key>CFBundleShortVersionString</key>
2121
<string>1.0.0</string>
2222
<key>CFBundleVersion</key>
23-
<string>1</string>
23+
<string>26</string>
24+
25+
<!-- iOS 26 Minimum Deployment -->
26+
<key>MinimumOSVersion</key>
27+
<string>26.0</string>
2428

2529
<!-- Launch Configuration -->
2630
<key>LSRequiresIPhoneOS</key>
@@ -52,6 +56,14 @@
5256
<key>NSPhotoLibraryUsageDescription</key>
5357
<string>QR-SHIELD needs photo library access to scan QR codes from saved images.</string>
5458

59+
<!-- iOS 26: Privacy Manifest Requirements -->
60+
<key>NSPrivacyTracking</key>
61+
<false/>
62+
<key>NSPrivacyTrackingUsageDescription</key>
63+
<string>QR-SHIELD does not track users.</string>
64+
<key>NSPrivacyCollectedDataTypes</key>
65+
<array/>
66+
5567
<!-- App Transport Security -->
5668
<key>NSAppTransportSecurity</key>
5769
<dict>
@@ -71,7 +83,13 @@
7183
<key>UIViewControllerBasedStatusBarAppearance</key>
7284
<true/>
7385

74-
<!-- App Background Modes (none needed) -->
86+
<!-- iOS 26: Liquid Glass Support -->
87+
<key>UIUserInterfaceStyle</key>
88+
<string>Dark</string>
89+
90+
<!-- iOS 26: Observable in UIKit (backport enabled) -->
91+
<key>UIObservationTrackingEnabled</key>
92+
<true/>
7593

7694
</dict>
7795
</plist>

0 commit comments

Comments
 (0)