Let's say I have a CloudKit database schema where I have records of type Author that are referenced by multiple records of type Article.
I want to delete an Author record if no Article is referencing it. Now consider the following conflict:
device A deleted the last Article referencing Author #42
device B uploads a new Article referencing Author #42 at the same time
The result should be that Author #42 is not deleted after both operations are finished. But both device don't know from each other changes. So either device B could miss that device A deleted the author. Or device A could have missed that a new Article was uploaded and therefore the Author #42 was deleted right after the upload of device B.
I though about using a reference count first. But this won't work if the ref count is part of the Author record. This is because deletions do not use the changeTag to detect lost updates: If device A found a reference count 0 and decides to delete the Author, it might miss that device B incremented the count meanwhile.
I currently see two alternatives:
Using a second record that outlives the Author to keep the reference count and using an atomic operation to update and delete it. So if the update fails, the delete would fail either.
Always adding a new child record to the Author whenever a reference is made. We could call it ReferenceToken. Since child records may not become dangling, CloudKit would stop a deletion, if a new ReferenceToken sets the parent reference to the Author.
Are there any better ways doing this?
                    
                  
                iCloud & Data
RSS for tagLearn how to integrate your app with iCloud and data frameworks for effective data storage
  
    
    Selecting any option will automatically load the page
  
  
  
  
    
  
  
            Post
Replies
Boosts
Views
Activity
                    
                      I'm using SwiftData to persist my items in storage. I used .modelContext to pass in my shared context, and on iOS 18 (both on a physical device and a simulator), I discovered a bug where SwiftData doesn't automatically save my data. For example, I could add a new item, go to the next screen, change something that reloads a previous screen, and SwiftData just forgets the item that I added. Please find the fully working code attached.
While writing this post, I realized that if I use .modelContainer instead of .modelContext, the issue is solved. So I have two questions:
It seems like .modelContainer is the go-to option when working with SwiftData, but why did an issue occur when I used .modelContext and passed in a shared container? When should we use .modelContext over .modelContainer?
What was the bug? It's working fine in iOS 17, but not in iOS 18. Or is this expected?
Here's the fully working code so you can copy and paste:
import SwiftUI
import SwiftData
typealias NamedColor = (color: Color, name: String)
extension Color {
    
    init(r: Double, g: Double, b: Double) {
        self.init(red: r/255, green: g/255, blue: b/255)
    }
    static let namedColors: [NamedColor] = [
        (.blue, "Blue"),
        (.red, "Red"),
        (.green, "Green"),
        (.orange, "Orange"),
        (.yellow, "Yellow"),
        (.pink, "Pink"),
        (.purple, "Purple"),
        (.teal, "Teal"),
        (.indigo, "Indigo"),
        (.brown, "Brown"),
        (.cyan, "Cyan"),
        (.gray, "Gray")
    ]
    
    static func name(for color: Color) -> String {
        return namedColors.first(where: { $0.color == color })?.name ?? "Blue"
    }
    
    static func color(for name: String) -> Color {
        return namedColors.first(where: { $0.name == name })?.color ?? .blue
    }
}
@main
struct SwiftDataTestApp: App {
    var sharedModelContainer: ModelContainer = {
        let schema = Schema([
            Item.self,
        ])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
        do {
            return try ModelContainer(for: schema, configurations: [modelConfiguration])
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()
    
    @AppStorage("accentColor") private var accentColorName: String = "Blue"
    var body: some Scene {
        WindowGroup {
            NavigationStack {
                HomeView()
            }
                .tint(Color.color(for: accentColorName))
        }
        .modelContainer(sharedModelContainer) // This works
//        .modelContext(ModelContext(sharedModelContainer)) // This doesn't work
    }
}
@Model
final class Item {
    var timestamp: Date
    
    init(timestamp: Date) {
        self.timestamp = timestamp
    }
}
struct HomeView: View {
    
    @State private var showSettings = false
    
    @Environment(\.modelContext) var modelContext
    @AppStorage("accentColor") private var accentColorName: String = "Blue"
    
    @Query private var items: [Item]
    
    var body: some View {
        List {
            ForEach(items) { item in
                NavigationLink {
                    Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))")
                } label: {
                    Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))
                }
            }
            
            Button {
                withAnimation {
                    let newItem = Item(timestamp: Date())
                    modelContext.insert(newItem)
                }
            } label: {
                Image(systemName: "plus")
                    .frame(maxWidth: .infinity)
                    .frame(maxHeight: .infinity)
            }
        }
        .navigationTitle("Habits")
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                Button(action: { showSettings = true }) {
                    Label("", systemImage: "gearshape.fill")
                }
            }
        }
        .navigationDestination(isPresented: $showSettings) {
            colorPickerView
        }
    }
    
    private var colorPickerView: some View {
        Form {
            Section(header: Text("Accent Color")) {
                Picker("Accent Color", selection: $accentColorName) {
                    ForEach(Color.namedColors, id: \.name) { namedColor in
                        Text(namedColor.name)
                            .tag(namedColor.name)
                            .foregroundColor(namedColor.color)
                    }
                }
                .pickerStyle(.wheel)
            }
        }
        .navigationTitle("Settings")
    }
}
                    
                  
                
                    
                      I'm still getting this error (SwiftData/ModelContext.swift:3253: Fatal error: Failed to identify a store that can hold instances of SwiftData._KKMDBackingData<Presents_2024.Item> from [:]) in Xcode 16.1 Beta (16B5001e).
The app works for a limited amount of time and then crashes with this error. It looks like the SwiftData model isn't being created properly and when a context is saved it crashes.
Can you tell me if this error will be fixed in the next beta?
                    
                  
                
              
                
              
              
                
                Topic:
                  
	
		App & System Services
  	
                
                
                SubTopic:
                  
                    
	
		iCloud & Data
		
  	
                  
                
              
              
                Tags:
              
              
  
  
    
      
      
      
        
          
            Xcode
          
        
        
      
      
    
      
      
      
        
          
            Xcode Sanitizers and Runtime Issues
          
        
        
      
      
    
      
      
      
        
          
            Core Data
          
        
        
      
      
    
      
      
      
        
          
            SwiftData
          
        
        
      
      
    
  
  
              
                
                
              
            
          
                    
                      I've been testing out SwiftData but haven't bee able to get ModelContext notifications working. I've tried both an objc observer and for await patterns but it never fires. If I listen for the older nsmanagedcontext notifications they are firing, but I am hoping that the new ones give an ID instead of an objectId. Has anyone got these working?
Attempt 1:
class NotificationObserver {
    init() {
        let didSaveNotification = ModelContext.didSave
        NotificationCenter.default.addObserver(self, selector: #selector(didSave(_:)),
                                               name: didSaveNotification, object: nil)
    }
    @objc func didSave(_ notification: Notification) {
        print(notification.name)
    }
}
Attempt 2:
class NotificationObserver {
    init() {
        let didSaveNotification = ModelContext.didSave
        Task {
            for await note in NotificationCenter.default.notifications(named: didSaveNotification) {
                print(note)
            }
        }
    }    
}
                    
                  
                
                    
                      As far as I can tell, there’s no equivalent to Core Data’s NSFetchedResultsController in SwiftData. It would be very helpful to have a way to respond to sets of changes in a ModelContext outside of a SwiftUI view. For instance, this is very helpful when using a Model-View-ViewModel architecture.
The @Query property wrapper is great for use in a SwiftUI view, but sometimes it’s helpful to process data outside of the view itself. The fetch() method on ModelContext is helpful for one-time operations, but as far as I can't tell it doesn't address receiving changes on an ongoing basis.
Am I missing some equivalent for this use case?
Also filed as feedback FB12288916
                    
                  
                
                    
                      I'm currently using Xcode 16 Beta (16A5171c) and I'm getting a crash whenever I attempt to fetch using my ModelContext in my SwiftUI video using the environment I'm getting a crash specifically on iOS 18 simulators.
I've opened up a feedback FB13831520 but it's worth noting that I can run the code I'll explain in detail below on iOS 17+ simulator and devices just fine.
I'm getting the following crash:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The specified URI is not a valid Core Data URI: x-coredata:///MyApp/XXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXXX'
It's almost as if on iOS18 SwiftData is unable to find the file on the simulator to perform CRUD operations.
All I'm doing in my project is simply fetching data using the modelContext.
    func contains(_ model: MyModel, in context: ModelContext) -> Bool {
        let objId = palette.persistentModelID
        let fetchDesc = FetchDescriptor<MyModel>(predicate: #Predicate { $0.persistentModelID == objId })
        let itemCount = try? context.fetchCount(fetchDesc)
        return itemCount != 0
    }
                    
                  
                
                    
                      My macOS app is developed using SwfitUI, SwiftData, and CloudKit. In the development environment, CloudKit works well. Locally added models can be quickly viewed in the CloudKit Console. macOS app and iOS app with the same BundleID can also synchronize data normally when developing locally. However, in the production environment, the macOS app cannot synchronize data with iCloud. But iOS app can. The models added in the production environment are only saved locally and cannot be viewed in CloudKit Console Production.
I am sure I have configured correctly, container schema changes to deploy to the Production environment. I think there may be a problem with CloudKit in macOS.
Please help troubleshoot the problem. I can provide you with any information you need.
    var body: some Scene {
        WindowGroup {
            MainView()
                .frame(minWidth: 640, minHeight: 480)
                .environment(mainViewModel)
        }
        .modelContainer(for: [NoteRecord.self])
    }
I didn't do anything special. I didn’t do anything special. I just used SwiftData hosted by CloudKit.
                    
                  
                
                    
                      Hi,
I have a mac os app that I am developing. It is backed by a SwiftData database. I'm trying to set up cloudkit so that the app's data can be shared across the user's devices. However, I'm finding that every tutorial i find online makes it sound super easy, but only discusses it from the perspective of ios.
The instructions typically say:
Add the iCloud capability.
Select CloudKit from its options.
Press + to add a new CloudKit container, or select one of your existing ones.
Add the Background Modes capability.
Check the box "Remote Notifications" checkbox from its options.
I'm having issue with the following:
I don't see background modes showing up or remote notifications checkbox since i'm making a mac os app.
If i do the first 3 steps only, when i launch my app i get an app crash while trying to load the persistent store. Here is the exact error message:
Add the iCloud capability.
Select CloudKit from its options.
Press + to add a new CloudKit container, or select one of your existing ones.
Add the Background Modes capability.
Check the box "Remote Notifications" checkbox from its options.
Any help would be greatly appreciated.
 var sharedModelContainer: ModelContainer = {
        let schema = Schema([One.self, Two.self])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
        do {
            return try ModelContainer(for: schema, configurations: [modelConfiguration])
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()
The fatal error in the catch block happens when i run the app.
                    
                  
                
                    
                      Is it possible to reset SwiftData to a state identical to that of a newly installed app?
I have experienced some migration issues where, when I add a new model, I need to reinstall the entire application for the ModelContainer creation to work.
Deleting all existing models does not seem to make any difference.
A potential solution I currently have, which appears to work but feels quite hacky, is as follows:
let _ = try! ModelContainer()
modelContainer = try! ModelContainer(for: Student.self, ...)
This seems to force out this error CoreData: error: Error: Persistent History (66) has to be truncated due to the following entities being removed: (...) which seems to reset SwiftData.
Any other suggestions?
                    
                  
                
                    
                      I have an app that uses SwiftData with CloudKit to synchronize data across a users devices. I'm able to replicate data created on one device on another and when removing data, it is also removed on the other device. So, I know that SwiftData and CloudKit are configured correctly.
What I'd like to do though, is to ensure that if a user installs the app on an additional device, that the data is synchronized upon app start.
When testing my app on a third device, via TestFlight, there was no data in the app upon launch even though all three devices are using the same Apple account (e.g. Apple ID).
What is the best way to achieve this?
                    
                  
                
                    
                      I've realized that I need to use migration plans, but those required versioned schemas. I think I've updated mine, but I wanted to confirm if this was the proper procedure. To start, none of my models were versioned. I've since wrapped them in a VersionedSchema like this:
enum TagV1: VersionedSchema {
    static var versionIdentifier: Schema.Version = .init(1, 0, 0)
    static var models: [any PersistentModel.Type] {
        [Tag.self]
    }
    
    @Model
    final class Tag {
        var id = UUID()
        
        var name: String = ""
        
        // Relationships
        var transactions: [Transaction]? = nil
        
        init(name: String) {
            self.name = name
        }
    }
}
I also created a type alias to point to this.
typealias Tag = TagV1.Tag
This is what my container looks like in my app file.
var sharedModelContainer: ModelContainer = {
        let schema = Schema([
            Tag.self
        ])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
        do {
            return try ModelContainer(for: schema, configurations: [modelConfiguration])
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()
The application builds and run successfully. Does this mean that my models are successfully versioned now? I'm trying to avoid an error I came across in earlier testing. That occurred because none of my models were versioned and I tried to setup a migration plan
Cannot use staged migration with an unknown coordinator model version.
                    
                  
                
                    
                      Hey folks, I'm having an issue where iCloud sync is only working in the Development environment, not on Prod. I have deployed the schema to Prod through the CloudKit console, although I did it after the app went live on the AppStore. Even though the two schema are identical, iCloud sync just doesn't work on Prod.
Things I tried on the code side:
Initially I did the most basic SwiftData+CloudKit setup:
var modelContainer: ModelContainer {
    let schema = Schema([Book.self, Goal.self])
    let config = ModelConfiguration(isStoredInMemoryOnly: false, cloudKitDatabase: doesUserSyncToiCloud ? .automatic : .none)
    var container: ModelContainer
    do {
        container = try ModelContainer(for: schema, configurations: config)
    } catch {
        fatalError()
    }
    return container
}
var body: some Scene {
    WindowGroup {
        AnimatedSplashScreen {
            MainTabView()
        }
    }
    .modelContainer(modelContainer)
}
This is enough to make iCloud sync work at the Development level. Then when I noticed the issues on Prod I did some digging and found this on the Docs (https://developer.apple.com/documentation/swiftdata/syncing-model-data-across-a-persons-devices):
let config = ModelConfiguration()
do {
#if DEBUG
    // Use an autorelease pool to make sure Swift deallocates the persistent 
    // container before setting up the SwiftData stack.
    try autoreleasepool {
        let desc = NSPersistentStoreDescription(url: config.url)
        let opts = NSPersistentCloudKitContainerOptions(containerIdentifier: "iCloud.com.example.Trips")
        desc.cloudKitContainerOptions = opts
        // Load the store synchronously so it completes before initializing the 
        // CloudKit schema.
        desc.shouldAddStoreAsynchronously = false
        if let mom = NSManagedObjectModel.makeManagedObjectModel(for: [Trip.self, Accommodation.self]) {
            let container = NSPersistentCloudKitContainer(name: "Trips", managedObjectModel: mom)
            container.persistentStoreDescriptions = [desc]
            container.loadPersistentStores {_, err in
                if let err {
                    fatalError(err.localizedDescription)
                }
            }
            // Initialize the CloudKit schema after the store finishes loading.
            try container.initializeCloudKitSchema()
            // Remove and unload the store from the persistent container.
            if let store = container.persistentStoreCoordinator.persistentStores.first {
                try container.persistentStoreCoordinator.remove(store)
            }
        }
    }
#endif
    modelContainer = try ModelContainer(for: Trip.self, Accommodation.self,
                                        configurations: config)
} catch {
    fatalError(error.localizedDescription)
}
I've no idea why Apple would include this CoreData setup in a SwiftData documentation, but I went ahead and adapted it to my code as well. I see now that some new "assets" were added to my Development schema, but I'm afraid to deploy these changes to Prod, since I'm not even confident that this CoreData setup is necessary in a SwiftData app.
Does anyone have any thoughts on this? Have you run into similar issues? Any help would be much appreciated; thanks!
                    
                  
                
                    
                      I created 2 different schemas, and made a small change to one of them. I added a property to the model called "version". To see if the migration went through, I setup the migration plan to set version to "1.1.0" in willMigrate. In the didMigrate, I looped through the new version of Tags to check if version was set, and if not, set it. I did this incase the willMigrate didn't do what it was supposed to. The app built and ran successfully, but version was not set in the Tag I created in the app.
Here's the migration:
enum MigrationPlanV2: SchemaMigrationPlan {
    static var schemas: [any VersionedSchema.Type] {
        [DataSchemaV1.self, DataSchemaV2.self]
    }
    
    static let stage1 = MigrationStage.custom(
        fromVersion: DataSchemaV1.self,
        toVersion: DataSchemaV2.self,
        willMigrate: { context in
            let oldTags = try? context.fetch(FetchDescriptor<DataSchemaV1.Tag>())
            
            for old in oldTags ?? [] {
                let new = Tag(name: old.name, version: "Version 1.1.0")
                context.delete(old)
                context.insert(new)
            }
            
            try? context.save()
        },
        didMigrate: { context in
            let newTags = try? context.fetch(FetchDescriptor<DataSchemaV2.Tag>())
            for tag in newTags ?? []{
                if tag.version == nil {
                    tag.version = "1.1.0"
                }
            }
        
        }
    )
    
    static var stages: [MigrationStage] {
        [stage1]
    }
    
}
Here's the model container:
var sharedModelContainer: ModelContainer = {
        let schema = Schema(versionedSchema: DataSchemaV2.self)
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)
        do {
            return try ModelContainer(
                for: schema,
                migrationPlan: MigrationPlanV2.self,
                configurations: [modelConfiguration])
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()
I ran a similar test prior to this, and got the same result. It's like the code in my willMigrate isn't running. I also had print statements in there that I never saw printed to the console. I tried to check the CloudKit console for any information, but I'm having issues with that as well (separate post).
Anyways, how can I confirm that my migration was successful here?
                    
                  
                
                    
                      struct ModelContainerSetup {
static let shared = ModelContainerSetup()
private static let containerIdentifier = "iCloud.Journal"
func setupModelContainer() -> ModelContainer {
    let schema = Schema([User.self])
    let modelConfiguration = ModelConfiguration(
        schema: schema,
        isStoredInMemoryOnly: false,
        cloudKitDatabase: .private(Self.containerIdentifier)
    )
   
    do {
        return try ModelContainer(for: schema, configurations: [modelConfiguration])
    } catch {
        fatalError("Could not create ModelContainer: \(error)")
    }
}
**Expected Behavior:
**
When CloudKit storage is full, the app should continue functioning with local storage
Data should persist locally even if cloud sync fails
Sync should resume when storage becomes available
**Actual Behavior:
**
ModelContainer initialization fails completely
Local data also stops getting saved
**Environment:
**
iOS 17.0+
SwiftData
Private CloudKit database
Ideal Behaviour:
When iCloud fails, the data should still be saved locally. I do not want to have two different containers so that I can maintain data consistency.
                    
                  
                
                    
                      I previously got this error when I used a PassKey to log in. I'm not using that. I've put my password in multiple times, closed the browser, etc. It doesn't seem to be working. The only thing I can think is that because my Mac is using a different iCloud account, it's not letting me.
Does anyone have any ideas?
                    
                  
                
                    
                      I'm trying to add Cloud Kit integration to SwiftData app (that is already in the App Store, btw).
When the app is installed on devices that are directly connected to Xcode, it works (a bit slow, but pretty well).
But when the app is distributed to Testflight internal testers, the synchronization doesn't happen at all.
So, is this situation normal and how can I test apps with iCloud integration properly?
                    
                  
                
                    
                      I created a new index on two record types on Oct 12th. I still cannot query the records using the new queryable index on records that were created before that date. There is no indication in the schema history that the reindexing has started, completed, failed, or still in progress.
What is the expectation for new indices being applied to existing records? Well over a week seems unacceptable for a database that has maybe 5000 records across a few record types.
When I query my data using an old index and an old record field, I get hundreds of matching results so I know the data is there.
FB15554144 - CloudKit / CloudKit Console: PRODUCTION ISSUE - Query against index created two weeks ago not returning all data as expected
                    
                  
                
              
                
              
              
                
                Topic:
                  
	
		App & System Services
  	
                
                
                SubTopic:
                  
                    
	
		iCloud & Data
		
  	
                  
                
              
              
                Tags:
              
              
  
  
    
      
      
      
        
          
            App Store
          
        
        
      
      
    
      
      
      
        
          
            CloudKit
          
        
        
      
      
    
      
      
      
        
          
            CloudKit Console
          
        
        
      
      
    
      
      
      
        
          
            CloudKit Dashboard
          
        
        
      
      
    
  
  
              
                
                
              
            
          
                    
                      I want to clear all the data in the zone, but I can't delete it. Below is my code, no logs are printed when running.
static func clearData() {
        let coordinator = shared.container.persistentStoreCoordinator
        
        let fm = FileManager.default
        for d in shared.container.persistentStoreDescriptions {
            guard let url = d.url else { continue }
            do {
                if fm.fileExists(atPath: url.path()) {
                    try coordinator.destroyPersistentStore(at: url, type: .sqlite)
                }
            } catch {
                logger.debug("Failed to delete db file, \(error)")
            }
        }
        
        for description in shared.container.persistentStoreDescriptions {
            guard let originalStoreURL = description.url else { continue }
            let walFileURL = originalStoreURL.deletingPathExtension().appendingPathExtension("sqlite-wal")
            let shmFileURL = originalStoreURL.deletingPathExtension().appendingPathExtension("sqlite-shm")
            
            for url in [originalStoreURL, walFileURL, shmFileURL] {
                do {
                    if fm.fileExists(atPath: url.path()) {
                        try fm.removeItem(at: url)
                    }
                } catch {
                    logger.debug("Failed to delete db file, \(error)")
                }
            }
        }
        
        let container = CKContainer(identifier:  appContainerID)
        container.privateCloudDatabase.fetchAllRecordZones { zones, error in
            if let error = error {
                print("Error fetching zones: ")
            } else if let zone = zones?.first, zone.zoneID.zoneName == "_defaultZone" {
                PersistenceController.shared.container.purgeObjectsAndRecordsInZone(with: zone.zoneID, in: nil) { ckShare, error in
                    if let error = error {
                        print("Error purge zones: \(error)")
                    }
                    if ckShare == nil {
                        print("ckShare is nil")
                    }
                }
            }
        }
    }
                    
                  
                
                    
                      I'm sorta baffled right now. I am trying to wonder how I might detect a updated SQL Store in an older app.
have a baseline app, and create a SQL-based repository
in an updated app, change the model and verify that you can see the updated model version. Using lightweight migration
re-run the older app (which will inherit the newer SQL repository).
YIKES - no error when creating the NSPersistenStoreCoordinator!
Nothing in the metadata to imply the store is newer than the model:
[_persistentStoreCoordinator metadataForPersistentStore:store]
My question: is there any way to detect this condition?
David
                    
                  
                
                    
                      Both appleIDs(create and modify/save) sign in iCloud.
I use the following code to modify and save records:
self.containerIdentifier).publicCloudDatabase
database.fetch(withRecordID: CKRecord.ID(recordName:groupID), completionHandler: { record, error in
            if error == nil && record != nil {
                if let iDs : [String] = record!.object(forKey: "memberIDs") as? Array {
                       if iDs.count < self.maxMemberCount {
                            if let mems: [String] = record!.object(forKey: "memberNames") as? Array {
                                if !(mems as NSArray).contains(name) {
                                    var members = mems
                                    members.append(name)
                                    record!.setObject(members as CKRecordValue, forKey: "memberNames")
                                    var iDs : [String] = record!.object(forKey: "memberIDs") as! Array
                                    iDs.append(self.myMemberID)
                                    record!.setObject(iDs as CKRecordValue, forKey:"memberIDs")
                                    database.save(record!, completionHandler: { record, error in
                                        if error == nil {
                                         } else {
                                            completion(error as NSError?)
                                            dPrint("Error : \(String(describing: error))")
                                        }
                                    })
                                }else{
                                    let DBError : NSError = NSError(domain: "DBError", code: 89, userInfo: ["localizedDescription": NSLocalizedString("Your nickname already used.", comment:"")])
                                    completion(DBError)
                                    print("change your nickname")
                                }
                            }else{
                                print("group DB error")
                                let DBError : NSError = NSError(domain: "DBError", code: 88, userInfo: ["localizedDescription": NSLocalizedString("Please try later.", comment:"")])
                                completion(DBError)
                            }
                }
            }else{
                print("Error : \(String(describing: error))")
            }
        })
I received the following error message:
?Error saving records: <CKError 0x600000bbe970: "Service Unavailable" (6/NSCocoaErrorDomain:4099); "Error connecting to CloudKit daemon. This could happen for many reasons, for example a daemon exit, a device reboot, a race with the connection inactivity monitor, invalid entitlements, and more. Check the logs around this time to investigate the cause of this error."; Retry after 5.0 seconds>
baseNSError@0	NSError	domain: "CKErrorDomain" - code: 6
_userInfo	__NSDictionaryI *	4 key/value pairs	0x000060000349e300
[0]	(null)	"NSLocalizedDescription" : "Error connecting to CloudKit daemon. This could happen for many reasons, for example a daemon exit, a device reboot, a race with the connection inactivity monitor, invalid entitlements, and more. Check the logs around this time to investigate the cause of this error."
key	__NSCFConstantString *	"NSLocalizedDescription"	0x00000001117155a0
value	__NSCFConstantString *	"Error connecting to CloudKit daemon. This could happen for many reasons, for example a daemon exit, a device reboot, a race with the connection inactivity monitor, invalid entitlements, and more. Check the logs around this time to investigate the cause of this error."	0x000000011057e700
[1]	(null)	"CKRetryAfter" : Int32(5)
key	__NSCFConstantString *	"CKRetryAfter"	0x000000011057c680
value	NSConstantIntegerNumber?	Int32(5)	0x00000001105c2ed0
[2]	(null)	"CKErrorDescription" : "Error connecting to CloudKit daemon. This could happen for many reasons, for example a daemon exit, a device reboot, a race with the connection inactivity monitor, invalid entitlements, and more. Check the logs around this time to investigate the cause of this error."
key	__NSCFConstantString *	"CKErrorDescription"	0x0000000110568d00
value	__NSCFConstantString *	"Error connecting to CloudKit daemon. This could happen for many reasons, for example a daemon exit, a device reboot, a race with the connection inactivity monitor, invalid entitlements, and more. Check the logs around this time to investigate the cause of this error."	0x000000011057e700
[3]	(null)	"NSUnderlyingError" : domain: "NSCocoaErrorDomain" - code: 4099
key	__NSCFConstantString *	"NSUnderlyingError"	0x0000000111715540
value	NSError?	domain: "NSCocoaErrorDomain" - code: 4099	0x00006000016cc300
                    
                  
                
              
                
              
              
                
                Topic:
                  
	
		App & System Services
  	
                
                
                SubTopic:
                  
                    
	
		iCloud & Data