Use when implementing 'CloudKit sync', 'CKSyncEngine', 'CKRecord', 'CKDatabase', 'SwiftData CloudKit', 'shared database', 'public database', 'CloudKit zones', 'conflict resolution' - comprehensive CloudKit database APIs and modern sync patterns reference
View on GitHubSelect agents to install to:
npx add-skill https://github.com/CharlesWiltgen/Axiom/blob/main/.claude-plugin/plugins/axiom/skills/axiom-cloudkit-ref/SKILL.md -a claude-code --skill axiom-cloudkit-refInstallation paths:
.claude/skills/axiom-cloudkit-ref/# CloudKit Reference
**Purpose**: Comprehensive CloudKit reference for database-based iCloud storage and sync
**Availability**: iOS 10.0+ (basic), iOS 17.0+ (CKSyncEngine), iOS 17.0+ (SwiftData integration)
**Context**: Modern CloudKit sync via CKSyncEngine (WWDC 2023) or SwiftData integration
## When to Use This Skill
Use this skill when:
- Implementing structured data sync to iCloud
- Choosing between SwiftData+CloudKit, CKSyncEngine, or raw CloudKit APIs
- Setting up public/private/shared databases
- Implementing conflict resolution
- Debugging CloudKit sync issues
- Monitoring CloudKit performance
**NOT for**: Simple file sync (use `axiom-icloud-drive-ref` instead)
## Overview
**CloudKit is for STRUCTURED DATA sync** (records with relationships), not simple file sync.
Three modern approaches:
1. **SwiftData + CloudKit** (Easiest, iOS 17+)
2. **CKSyncEngine** (Custom persistence, iOS 17+, WWDC 2023)
3. **Raw CloudKit APIs** (Maximum control, more complexity)
---
## Approach 1: SwiftData + CloudKit (Recommended)
**When to use**: iOS 17+ apps with SwiftData models
**Limitations**:
- Private database only (no public/shared)
- Automatic sync (less control)
- SwiftData constraints apply
```swift
// ✅ CORRECT: SwiftData with CloudKit sync
import SwiftData
@Model
class Task {
var title: String
var isCompleted: Bool
var dueDate: Date
init(title: String, isCompleted: Bool = false, dueDate: Date) {
self.title = title
self.isCompleted = isCompleted
self.dueDate = dueDate
}
}
// Configure CloudKit container
let container = try ModelContainer(
for: Task.self,
configurations: ModelConfiguration(
cloudKitDatabase: .private("iCloud.com.example.app")
)
)
// That's it! Sync happens automatically
```
**Entitlements required**:
- iCloud capability
- CloudKit container
**Use `axiom-swiftdata` skill for SwiftData details**
---
## Approach 2: CKSyncEngine (Modern, WWDC 2023)
**When to use**: Custom per