CloudKit
CloudKit
Sync app data across devices using iCloud with CloudKit containers, records, and queries.
Setup & Container
Enable iCloud and CloudKit capability, then use a container and database.
Syntax:
let container = CKContainer.default()let db = container.privateCloudDatabase
Example
import CloudKit
let container = CKContainer.default()
let db = container.privateCloudDatabase
import SwiftUI
struct ContentView: View {
var body: some View {
Text("CloudKit Setup")
.padding()
}
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
This prepares a handle to the user's private database.
Save a Record
Create a CKRecord with fields and save it to the database.
Syntax:
let rec = CKRecord(recordType: "Type")db.save(rec) { ... }
Example
import CloudKit
func addNote(title: String, body: String, completion: @escaping (Result) -> Void) {
let rec = CKRecord(recordType: "Note")
rec["title"] = title as CKRecordValue
rec["body"] = body as CKRecordValue
CKContainer.default().privateCloudDatabase.save(rec) { saved, err in
if let saved = saved { completion(.success(saved)) } else { completion(.failure(err!)) }
}
}
import SwiftUI
struct ContentView: View {
var body: some View {
Text("CloudKit Save Example")
.padding()
}
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
This example writes a simple Note record into the private database.
Query Records
Fetch records matching a predicate using CKQuery.
Syntax:
CKQuery(recordType:predicate:)db.perform(query, inZoneWith:)
Example
import CloudKit
func loadNotes(completion: @escaping (Result<[CKRecord], Error>) -> Void) {
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Note", predicate: predicate)
CKContainer.default().privateCloudDatabase.perform(query, inZoneWith: nil) { records, err in
if let records = records { completion(.success(records)) } else { completion(.failure(err!)) }
}
}
import SwiftUI
struct ContentView: View {
var body: some View {
Text("CloudKit Query Example")
.padding()
}
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
This example loads all Note records. In production, prefer cursors or operations for large result sets.
Tip: Design for eventual consistency and handle network failures gracefully.