Skip to content

Conversation

@InCoB
Copy link

@InCoB InCoB commented Jan 17, 2026

CloudKit sync cannot enforce SwiftData uniqueness (@Attribute(.unique) / #Unique). Don’t use uniqueness constraints with CloudKit-backed SwiftData stores.

This commit:

  • Adds a prominent warning in the CloudKit Constraints section
  • Shows correct pattern (regular property with default) vs incorrect (@Attribute(.unique))
  • Provides deduplication strategy for apps that need uniqueness checks
  • Why This Is a Bug
  1. CloudKit's distributed, asynchronous sync model cannot enforce unique constraints across devices
  2. WWDC23 Lab Notes confirmed that Core Data + CloudKit constraints apply to SwiftData
  3. Multiple reports on Apple Developer Forums and Stack Overflow confirm crashes
  4. Using @Attribute(.unique) with CloudKit will either:
    • Cause the app to crash
    • Be silently ignored (leading to duplicate records)

Sources

Sources for CloudKit + @Attribute(.unique) Issue
Stack Overflow

Thread discussing crashes with unique constraints and CloudKit
`
Developer reports crash scenarios
FatBobMan (Well-known SwiftData Expert)
*
Comprehensive SwiftData guide stating CloudKit doesn't support unique constraints
DevTechie

Documents that even the iOS 18 #Unique macro is NOT compatible with CloudKit
Firewhale.io

Lists CloudKit data model rules including no unique constraints
Apple Developer Forums
*
WWDC23 Lab confirmations about CloudKit constraints applying to SwiftData

CloudKit cannot enforce unique constraints across devices due to its distributed,
asynchronous sync model. Using @Attribute(.unique) with CloudKit sync will cause
crashes or be silently ignored.

This commit:
- Adds a prominent warning in the CloudKit Constraints section
- Shows correct pattern (regular property with default) vs incorrect (@Attribute(.unique))
- Provides deduplication strategy for apps that need uniqueness checks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant