Thanks for being a part of WWDC25!

How did we do? We’d love to know your thoughts on this year’s conference. Take the survey here

CloudKit is not synchronizing with coredata for relationships

In core-data I have a contact and location entity. I have one-to-many relationship from contact to locations and one-to-one from location to contact. I create contact in a seperate view and save it. Later I create a location, fetch the created contact, and save it while specifying the relationship between location and contact contact and test if it actually did it and it works.


   viewContext.perform {
        do {
            // Set relationship using the generated accessor method
            currentContact.addToLocations(location)

            try viewContext.save()
            
            print("Saved successfully. Locations count:", currentContact.locations?.count ?? 0)
            
            if let locs = currentContact.locations {
                print("📍 Contact has \(locs.count) locations.")
                for loc in locs {
                    print("➡️ Location: \(String(describing: (loc as AnyObject).locationName ?? "Unnamed"))")
                }
            }

            
        } catch {
            
            print("Failed to save location: \(error.localizedDescription)")
        }

    }

In my NSManagedObject class properties I have this : for Contact:

      @NSManaged public var locations: NSSet?

for Location:

     @NSManaged public var contact: Contact?

in my persistenceController I have:

for desc in [publicStore, privateStore] {
            desc.setOption(true as NSNumber, forKey: 

NSPersistentStoreRemoteChangeNotificationPostOptionKey)
            desc.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
            desc.setOption(true as NSNumber, forKey: NSMigratePersistentStoresAutomaticallyOption)
            desc.setOption(true as NSNumber, forKey: NSInferMappingModelAutomaticallyOption)
            desc.setOption(true as NSNumber, forKey: "CKSyncCoreDataDebug") // Optional: Debug sync
            
            // Add these critical options for relationship sync
            desc.setOption(true as NSNumber, forKey: "NSPersistentStoreCloudKitEnforceRecordExistsKey")
            desc.setOption(true as NSNumber, forKey: "NSPersistentStoreCloudKitMaintainReferentialIntegrityKey")
            
            // Add this specific option to force schema update
            desc.setOption(true as NSNumber, forKey: "NSPersistentStoreRemoteStoreUseCloudKitSchemaKey")
        }

When synchronization happens on CloudKit side, it creates CKRecords: CD_Contact and CD_Location. However for CD_Location it creates the relationship CD_contact as a string and references the CD_Contact. This I thought should have come as REFERENCE On the CD_Contact there is no CD_locations field at all. I do see the relationships being printed on coredata side but it does not come as REFERENCE on cloudkit. Spent over a day on this. Is this normal, what am I doing wrong here? Can someone advise?

CloudKit is not synchronizing with coredata for relationships
 
 
Q