Sign the macOS app and keep its state in SwiftData with iCloud sync

This commit is contained in:
Ian Gulliver
2026-10-17 10:13:26 -07:00
parent d21215b442
commit 1808ca8be6
11 changed files with 195 additions and 36 deletions
+30 -9
View File
@@ -1,9 +1,9 @@
import CoreData
import Foundation
import Observation
import SwiftData
import SwiftUI
private let originKey = "byre.server"
@MainActor
@Observable
final class Connection {
@@ -21,16 +21,33 @@ final class Connection {
@ObservationIgnored private var generation = 0
init() {
let saved = UserDefaults.standard.string(forKey: originKey)
serverText = saved ?? ""
if let saved, let origin = parseOrigin(saved) {
phase = .starting
Task {
await start(origin)
serverText = ""
resume()
Task {
for await note in NotificationCenter.default.notifications(named: NSPersistentCloudKitContainer.eventChangedNotification) {
if let event = note.userInfo?[NSPersistentCloudKitContainer.eventNotificationUserInfoKey] as? NSPersistentCloudKitContainer.Event, event.type == .import, event.endDate != nil {
store?.drafts?.reload()
resume()
}
}
}
}
private func resume() {
guard case .connect = phase, serverText.isEmpty, !connecting, let saved = Self.servers().first?.origin, let origin = parseOrigin(saved) else {
return
}
serverText = saved
phase = .starting
Task {
await start(origin)
}
}
private static func servers() -> [ServerRecord] {
fetchRecords(FetchDescriptor(sortBy: [SortDescriptor(\.saved, order: .reverse)]))
}
var store: Store? {
if case .running(let store) = phase {
return store
@@ -59,7 +76,11 @@ final class Connection {
return
}
connecting = false
UserDefaults.standard.set(origin.absoluteString, forKey: originKey)
for server in Self.servers() {
persistence.delete(server)
}
persistence.insert(ServerRecord(origin: origin.absoluteString))
saveRecords()
serverText = origin.absoluteString
phase = .starting
await start(origin)