# 28. iOS App — SwiftUI Foundation, Navigation, and Shared Theme meta: id: shieldai-unified-restructure-28 feature: shieldai-unified-restructure priority: P1 depends_on: [shieldai-unified-restructure-01, shieldai-unified-restructure-02] tags: [ios, swiftui, foundation, navigation, mobile] objective: - Establish the iOS app foundation in `iOS/ShieldAI/`: a SwiftUI project with app entry point, navigation architecture, and a shared theme system that mirrors the web app's ShieldAI brand palette and auto-shifting dark mode. deliverables: - `iOS/ShieldAI/ShieldAIApp.swift` — App entry point: - `@main` app struct with `WindowGroup` - Initializes dependency container (if using DI) - Sets up appearance (tint color, navigation bar style) - `iOS/ShieldAI/ContentView.swift` — Root view: - `TabView` with 5 tabs: Dashboard, Services, Alerts, Settings, Account - Or `NavigationStack` with sidebar for iPad - Handles auth state: shows `AuthView` if unauthenticated, `MainView` if authenticated - `iOS/ShieldAI/Navigation/` — Navigation infrastructure: - `AppRouter.swift` — Navigation path manager using `NavigationPath` - `Route.swift` — Enum of all app routes with associated values - `RouterViewModifier.swift` — View modifier for deep linking - `iOS/ShieldAI/Theme/` — Shared theme system: - `ShieldAITheme.swift` — Theme protocol/struct with colors, fonts, spacing - `Color+ShieldAI.swift` — SwiftUI Color extensions for all brand tokens: - `brandPrimary`, `brandPrimaryLight`, `brandPrimaryDark` - `brandAccent`, `brandAccentLight`, `brandAccentDark` - `bgPrimary`, `bgSecondary`, `bgTertiary` - `textPrimary`, `textSecondary`, `textTertiary` - `border`, `success`, `warning`, `error` - `Font+ShieldAI.swift` — Typography scale matching web app - `ThemeManager.swift` — Observable object managing light/dark/system mode - `iOS/ShieldAI/Info.plist` and `Assets.xcassets/`: - App icon set (reuse web app SVGs converted to PNG/AppIcon) - Color assets for dynamic light/dark variants - Launch screen storyboard or SwiftUI launch view - Project configuration: - Xcode project or Swift Package Manager setup - Minimum iOS version: 16.0 (SwiftUI 2.0+ features, NavigationStack) - Target devices: iPhone + iPad steps: 1. Verify `iOS/ShieldAI/` exists and has a valid Xcode project or Package.swift. 2. Create `ShieldAIApp.swift`: - Set global accent color to `brandPrimary` - Configure navigation bar appearance - Inject `ThemeManager` as environment object 3. Create `ContentView.swift`: - Use `@StateObject` for auth state - If unauthenticated: present full-screen `AuthView` (task 30) - If authenticated: show `TabView` with tabs 4. Create navigation system: - `Route` enum with cases: `.dashboard`, `.service(ShieldService)`, `.alertDetail(Alert)`, `.settings`, `.profile`, etc. - `AppRouter` class with `NavigationPath` and `navigate(to:)`, `pop()`, `popToRoot()` - Support deep linking via URL scheme (`shieldai://dashboard`, `shieldai://alert/123`) 5. Create theme system: - Define all colors as static properties on `Color` extension - Use `UIColor` dynamic colors for light/dark variants: ```swift static let bgPrimary = Color(UIColor { traitCollection in traitCollection.userInterfaceStyle == .dark ? UIColor(hex: "#111827") : UIColor(hex: "#fafbfc") }) ``` - Define font scale: `.caption`, `.body`, `.headline`, `.title`, `.largeTitle` - Define spacing scale: `.xs` (4), `.sm` (8), `.md` (16), `.lg` (24), `.xl` (32), `.xxl` (48) 6. Create `ThemeManager.swift`: - `@Published var colorScheme: ColorScheme?` (nil = system) - Methods: `setLight()`, `setDark()`, `setSystem()` - Persist preference in `UserDefaults` - Apply to root view using `.preferredColorScheme()` 7. Set up assets: - Convert ShieldAI logo SVG to PDF or PNG for Xcode assets - Create color assets for all theme tokens with "Any, Dark" variants - Add AppIcon set for all required sizes 8. Build and run on iOS Simulator to verify app launches with correct theme. steps: - Unit: ThemeManager correctly toggles between light/dark/system - Unit: Color extensions return correct values for light and dark traits - Unit: AppRouter pushes and pops routes correctly - Visual: App launches with ShieldAI branding and correct tab structure - Visual: Theme shifts correctly when device dark mode toggles acceptance_criteria: - [ ] iOS app launches without crashes on iPhone and iPad simulators - [ ] Tab navigation has 5 tabs with correct icons and labels - [ ] Theme colors match web app palette in both light and dark modes - [ ] Theme manager persists user preference across app restarts - [ ] Navigation stack works for pushing and popping views - [ ] Deep linking supports `shieldai://` URL scheme - [ ] App icon and launch screen display correctly validation: - Build and run on iPhone 15 Pro simulator (iOS 17+) - Toggle device dark mode and verify all colors shift - Test navigation by tapping through all tabs and sub-pages - Verify deep link: `xcrun simctl openurl booted shieldai://dashboard` - Run unit tests via Xcode Cmd+U notes: - The iOS app should feel like a native sibling to the web app, not a port. Use native iOS patterns (tab bar, navigation bar, sheets, context menus). - SwiftUI's `NavigationStack` (iOS 16+) replaces the older `NavigationView`. Use it for proper path-based navigation. - For iPad, consider a sidebar (`NavigationSplitView`) instead of tab bar for better space utilization. - The theme system should be the single source of truth for all visual values. No hardcoded colors anywhere in the app. - Use SF Symbols for icons where possible. For custom icons (ShieldAI logo), use vector PDFs in assets.