Add os.Logger diagnostics to SyncEngine.connect()

This commit is contained in:
2026-06-19 14:49:06 -04:00
parent 85d0eaddbb
commit 31583c27c7
+8
View File
@@ -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()