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/CloudSharingLifecycle.swift | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 DomainDig/CloudSharingLifecycle.swift (limited to 'DomainDig/CloudSharingLifecycle.swift') diff --git a/DomainDig/CloudSharingLifecycle.swift b/DomainDig/CloudSharingLifecycle.swift new file mode 100644 index 0000000..fc5de80 --- /dev/null +++ b/DomainDig/CloudSharingLifecycle.swift @@ -0,0 +1,31 @@ +import CloudKit +import UIKit + +final class DomainDigAppDelegate: NSObject, UIApplicationDelegate { + func application( + _ application: UIApplication, + configurationForConnecting connectingSceneSession: UISceneSession, + options: UIScene.ConnectionOptions + ) -> UISceneConfiguration { + let configuration = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role) + configuration.delegateClass = DomainDigSceneDelegate.self + return configuration + } +} + +final class DomainDigSceneDelegate: NSObject, UIWindowSceneDelegate { + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + guard let metadata = connectionOptions.cloudKitShareMetadata else { return } + accept(metadata: metadata) + } + + func windowScene(_ windowScene: UIWindowScene, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) { + accept(metadata: cloudKitShareMetadata) + } + + private func accept(metadata: CKShare.Metadata) { + Task { + try? await CloudSyncService.shared.acceptShare(metadata: metadata) + } + } +} -- cgit v1.2.3