krz/domain-dig

an ios app for DNS & SSL analysis

clone: git clone https://gitbay.org/krz/domain-dig.git

v4.5.0: DomainDig/DomainDigApp.swift · raw

 1//
 2//  DomainDigApp.swift
 3//  DomainDig
 4//
 5//  Created by cmc on 2026-03-10.
 6//
 7
 8import SwiftUI
 9
10@main
11struct DomainDigApp: App {
12    @UIApplicationDelegateAdaptor(DomainDigAppDelegate.self) private var appDelegate
13    @Environment(\.scenePhase) private var scenePhase
14    @AppStorage(AppDensity.userDefaultsKey) private var density = AppDensity.compact.rawValue
15    @State private var viewModel = DomainViewModel()
16    @State private var purchaseService = PurchaseService.shared
17    @State private var cloudSyncService = CloudSyncService.shared
18    @State private var localAPIService = LocalAPIService.shared
19
20    init() {
21        LocalNotificationService.shared.configureForegroundPresentation()
22        DomainMonitoringScheduler.shared.registerBackgroundTask()
23    }
24
25    var body: some Scene {
26        WindowGroup {
27            RootTabView(viewModel: viewModel)
28                .environment(\.appDensity, AppDensity(rawValue: density) ?? .compact)
29                .task {
30                    let _ = purchaseService.currentTier
31                    let _ = cloudSyncService.status
32                    let _ = localAPIService.isRunning
33                    let _ = IntegrationService.shared.targets.count
34                    await purchaseService.refreshEntitlements()
35                    viewModel.refreshMonitoringState()
36                    await viewModel.refreshMonitoringAuthorizationStatus()
37                    await cloudSyncService.refreshAvailability()
38                    localAPIService.refresh()
39                    cloudSyncService.scheduleSyncIfNeeded(trigger: .launch)
40                    viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
41                    IntegrationService.shared.processQueueNow()
42                    viewModel.refreshWidgetData()
43                }
44                .onReceive(NotificationCenter.default.publisher(for: .cloudSyncDidApplyChanges)) { _ in
45                    viewModel.refreshPersistedData()
46                    viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
47                    IntegrationService.shared.refresh()
48                }
49        }
50        .onChange(of: scenePhase) { _, newValue in
51            guard newValue == .active else { return }
52            viewModel.refreshMonitoringState()
53            Task {
54                await viewModel.refreshMonitoringAuthorizationStatus()
55                await cloudSyncService.refreshAvailability()
56            }
57            localAPIService.refresh()
58            cloudSyncService.scheduleSyncIfNeeded(trigger: .launch)
59            viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
60            IntegrationService.shared.processQueueNow()
61            viewModel.refreshWidgetData()
62        }
63    }
64}