From 31583c27c7aedb9e282123584760e27e3cb2f668 Mon Sep 17 00:00:00 2001 From: rzen Date: Fri, 19 Jun 2026 14:49:06 -0400 Subject: [PATCH] Add os.Logger diagnostics to SyncEngine.connect() --- Workouts/Sync/SyncEngine.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Workouts/Sync/SyncEngine.swift b/Workouts/Sync/SyncEngine.swift index ad98f18..7690a5f 100644 --- a/Workouts/Sync/SyncEngine.swift +++ b/Workouts/Sync/SyncEngine.swift @@ -1,6 +1,7 @@ import Foundation import SwiftData import Observation +import os enum ICloudStatus: Equatable { case checking @@ -23,6 +24,7 @@ final class SyncEngine { /// this to push fresh state to the watch. var onCacheChanged: (() -> Void)? + private let log = Logger(subsystem: "dev.rzen.indie.Workouts", category: "sync") private let modelContainer: ModelContainer private var fileManager: ICloudFileManager? private var monitor: ICloudFileMonitor? @@ -42,14 +44,17 @@ final class SyncEngine { connectAttempt += 1 let attempt = connectAttempt iCloudStatus = .checking + log.info("connect[\(attempt)]: resolving container \(Self.containerIdentifier, privacy: .public)") let url = await Task.detached { FileManager.default.url(forUbiquityContainerIdentifier: Self.containerIdentifier) }.value guard let containerURL = url else { + log.error("connect[\(attempt)]: ubiquity container URL is nil → unavailable (iCloud Drive off, or container not provisioned)") if attempt == connectAttempt { iCloudStatus = .unavailable } return } + log.info("connect[\(attempt)]: container URL = \(containerURL.path, privacy: .public)") let fm = ICloudFileManager(containerURL: containerURL) @@ -57,15 +62,18 @@ final class SyncEngine { try? await Task.sleep(for: .seconds(20)) guard let self, !Task.isCancelled else { return } if self.iCloudStatus == .checking, attempt == self.connectAttempt { + self.log.error("connect[\(attempt)]: timed out after 20s — first container file op blocked (dataless container?)") self.iCloudStatus = .unavailable } } + log.info("connect[\(attempt)]: preparing directories…") await fm.prepareDirectories() timeout.cancel() guard attempt == connectAttempt else { return } self.fileManager = fm iCloudStatus = .available + log.info("connect[\(attempt)]: directories ready → available") WorkoutsModelContainer.persistCurrentIdentityToken() await reconcile()