krz/domain-dig
an ios app for DNS & SSL analysis
clone: git clone https://gitbay.org/krz/domain-dig.git
v4.8.2: 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 ScheduledReportScheduler.shared.registerBackgroundTask()
24 }
25
26 var body: some Scene {
27 WindowGroup {
28 RootTabView(viewModel: viewModel)
29 .environment(\.appDensity, AppDensity(rawValue: density) ?? .compact)
30 .task {
31 let _ = purchaseService.currentTier
32 let _ = cloudSyncService.status
33 let _ = localAPIService.isRunning
34 let _ = IntegrationService.shared.targets.count
35 await purchaseService.refreshEntitlements()
36 viewModel.refreshMonitoringState()
37 await viewModel.refreshMonitoringAuthorizationStatus()
38 await cloudSyncService.refreshAvailability()
39 localAPIService.refresh()
40 cloudSyncService.scheduleSyncIfNeeded(trigger: .launch)
41 viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
42 ScheduledReportScheduler.shared.syncSchedule()
43 IntegrationService.shared.processQueueNow()
44 viewModel.refreshWidgetData()
45 consumeShareInbox()
46 }
47 .onReceive(NotificationCenter.default.publisher(for: .cloudSyncDidApplyChanges)) { _ in
48 viewModel.refreshPersistedData()
49 viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
50 IntegrationService.shared.refresh()
51 }
52 }
53 .onChange(of: scenePhase) { _, newValue in
54 guard newValue == .active else { return }
55 viewModel.refreshMonitoringState()
56 Task {
57 await viewModel.refreshMonitoringAuthorizationStatus()
58 await cloudSyncService.refreshAvailability()
59 }
60 localAPIService.refresh()
61 cloudSyncService.scheduleSyncIfNeeded(trigger: .launch)
62 viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
63 ScheduledReportScheduler.shared.syncSchedule()
64 IntegrationService.shared.processQueueNow()
65 viewModel.refreshWidgetData()
66 consumeShareInbox()
67 }
68 }
69
70 /// Picks up a domain shared via the share extension and routes it into an
71 /// inspection through the intent router (consumed by `RootTabView`).
72 private func consumeShareInbox() {
73 guard let domain = DomainDigShareInbox.consume() else { return }
74 DomainDigIntentRouter.shared.pendingAction = .inspect(domain)
75 }
76}