From b35f1b432fc24fbab1fa05593c9a0bca7e4d95a6 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Thu, 23 Apr 2026 23:12:34 -0500 Subject: feat(v3.6.0): add iCloud sharing for workflows and tracked domains - implement CloudKit sharing (CKShare) for TrackedDomain and DomainWorkflow - support read-only and editable permissions - add Share actions and shared state indicators in UI - handle shared record ownership and participant roles - implement deterministic conflict resolution to prevent duplication - ensure compatibility with existing iCloud sync layer - maintain local-first behavior with graceful offline handling - remove debug logging for domain availability/rdap messages notes: - no custom backend or accounts introduced - sharing is Apple ecosystem only (iCloud-based) - large history data remains local-only --- DomainDig/DomainDigApp.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'DomainDig/DomainDigApp.swift') diff --git a/DomainDig/DomainDigApp.swift b/DomainDig/DomainDigApp.swift index f7cd15e..4bb1b8f 100644 --- a/DomainDig/DomainDigApp.swift +++ b/DomainDig/DomainDigApp.swift @@ -9,10 +9,12 @@ import SwiftUI @main struct DomainDigApp: App { + @UIApplicationDelegateAdaptor(DomainDigAppDelegate.self) private var appDelegate @Environment(\.scenePhase) private var scenePhase @AppStorage(AppDensity.userDefaultsKey) private var density = AppDensity.compact.rawValue @State private var viewModel = DomainViewModel() @State private var purchaseService = PurchaseService.shared + @State private var cloudSyncService = CloudSyncService.shared init() { LocalNotificationService.shared.configureForegroundPresentation() @@ -25,9 +27,16 @@ struct DomainDigApp: App { .environment(\.appDensity, AppDensity(rawValue: density) ?? .compact) .task { let _ = purchaseService.currentTier + let _ = cloudSyncService.status await purchaseService.refreshEntitlements() viewModel.refreshMonitoringState() await viewModel.refreshMonitoringAuthorizationStatus() + await cloudSyncService.refreshAvailability() + cloudSyncService.scheduleSyncIfNeeded(trigger: .launch) + viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule() + } + .onReceive(NotificationCenter.default.publisher(for: .cloudSyncDidApplyChanges)) { _ in + viewModel.refreshPersistedData() viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule() } } @@ -36,7 +45,9 @@ struct DomainDigApp: App { viewModel.refreshMonitoringState() Task { await viewModel.refreshMonitoringAuthorizationStatus() + await cloudSyncService.refreshAvailability() } + cloudSyncService.scheduleSyncIfNeeded(trigger: .launch) viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule() } } -- cgit v1.2.3