CloudKit 是 Apple 提供的一个框架,旨在帮助开发者将应用程序与 iCloud 集成,提供强大的后端服务用于存储和同步数据。它是一个基于云的解决方案,支持多种平台,包括 iOS、macOS、tvOS 和 watchOS。通过 CloudKit,开发者无需维护复杂的服务器基础设施即可实现数据的同步和共享功能。
照片来源:developer.apple.com
CloudKit 的核心功能
1、数据存储和同步
私有数据库:每个用户的私有数据,仅该用户可以访问。
公共数据库:存储共享的数据,所有用户可以访问(但有权限管理)。
共享数据库:允许用户与其他人共享特定的数据记录。
2、iCloud 集成
数据与用户的 iCloud 账户绑定,开发者无需管理用户认证。
支持跨设备的实时同步,确保不同设备上的数据保持一致。
3、强大的查询支持
提供类似 SQL 的查询接口,可以高效地检索数据。
4、离线支持
支持离线操作,在用户恢复网络连接后,CloudKit 会自动同步。
5、高效的通知机制
支持 Push Notification,当数据库中的数据发生更改时,可以向设备发送通知。
CloudKit 的主要组件
1、Container(容器)
容器是 CloudKit 数据的逻辑分区,每个应用默认有一个唯一的容器。
容器名称通常类似于 iCloud.com.example.myapp
例如,存钱猪猪使用的容器名称:
iCloud.com.fangjunyu.piglet
如果创建iCloud容器时,使用的是com前缀,Xcode也会自动添加iCloud前缀。
2、Database(数据库)
Private Database(私有数据库):每个用户有一个独立的数据库。
Public Database(公共数据库):所有用户共享的数据存储。
Shared Database(共享数据库):用户之间共享的数据存储。
3、Record(记录)
数据存储的基本单元,类似于数据库中的行。
每个记录是一个 CKRecord 对象,可以包含键值对和元数据。
4、Zone(区域)
数据库的逻辑分区,用于组织数据记录。
默认区域为 _defaultZone。
5、Subscription(订阅)
用于监听特定数据库或记录的更改,当满足条件时触发通知。
CloudKit数据库分类
在使用 CloudKit 时,选择 私有数据库(Private Database)、公共数据库(Public Database)还是 共享数据库(Shared Database)取决于应用场景和数据共享需求。
以下是三种数据库的特点和使用建议:
私有数据库(Private Database)
特点:
每个用户都有独立的私有数据库。
数据只能被拥有该 iCloud 账户的用户访问。
默认情况下,数据存储在用户的 iCloud 空间中,受其 iCloud 存储配额限制。
适用场景:
用户隐私数据:如用户的个人笔记、待办事项或健康数据。
不需要共享:数据与其他用户完全隔离,无需在不同用户之间共享。
空间敏感型应用:因为占用的是用户的 iCloud 存储,适合存储较小的个性化数据。
使用建议:
选择私有数据库时,可以通过 CKContainer.default().privateCloudDatabase 获取访问权限。每个用户只能访问自己的私有数据,这对保护隐私非常有用。
公共数据库(Public Database)
特点:
所有用户共享一个公共数据库。
数据对所有用户可见,权限由开发者定义。
数据存储在应用的 CloudKit 容器中,不受单个用户 iCloud 存储配额限制。
适用场景:
共享内容:如全局排行榜、新闻列表、开放的社交媒体内容等。
不需要区分用户的公共数据:如应用的公共配置、静态内容。
大规模数据存储:由于不占用用户的 iCloud 存储空间,适合存储需要全局共享的大数据。
注意事项:
公共数据库的数据对所有用户可见,需要妥善管理权限,避免敏感信息泄露。
如果数据量很大,可能会增加 CloudKit 的带宽和存储成本。
共享数据库(Shared Database)
特点:
用户可以将自己的私有数据与其他用户共享。
数据由拥有者存储在其私有数据库中,但其他用户可以通过共享机制访问。
共享是由用户主动发起的,需要明确的邀请和接受机制。
适用场景:
协作应用:如共享相册、共同编辑的文档或多人游戏中的共享状态。
用户授权共享:数据只有在拥有者允许时,其他用户才能访问。
部分共享:允许用户精细化选择要共享的数据。
使用建议:
共享数据库是基于私有数据库构建的扩展功能。使用时需设计用户授权和邀请逻辑,如通过 CKShare 和 CKShare.Metadata 管理共享。
如何选择哪种数据库?
CloudKit 的使用场景
1、跨设备同步
例如,用户在 iPhone 上创建的笔记,可以实时同步到 iPad 和 Mac。
2、多用户共享
用户可以与其他人共享照片、文件或其他数据。
3、实时协作
支持多用户在同一个数据集上进行协作,如协作文档、多人游戏。
4、服务器后端替代
开发者可以使用 CloudKit 替代传统的后端服务器,减少开发和维护成本。
CloudKit 的优点
1、无需维护服务器:Apple 提供的服务器端完全托管,开发者专注于客户端开发。
2、安全性高:数据加密并与用户的 iCloud 账户绑定。
3、免费使用:一定的存储和请求配额免费,超出后需支付额外费用。
4、与 Apple 生态无缝集成:支持 iCloud Drive、iCloud Key-Value 存储等。
如何在 Swift 中使用 CloudKit
1、设置 CloudKit 容器
在 Apple Developer Console 中启用 iCloud 并配置容器。
注:配置容器部分可以参考《SwiftData数据同步到iCloud》。
2、读取/写入数据
import CloudKit
let container = CKContainer.default()
let database = container.privateCloudDatabase
// 创建记录
let record = CKRecord(recordType: "Note")
record["title"] = "Hello, CloudKit" as CKRecordValue
// 保存记录
database.save(record) { savedRecord, error in
if let error = error {
print("Error saving record: \(error)")
} else {
print("Record saved: \(savedRecord)")
}
}
// 查询记录
let query = CKQuery(recordType: "Note", predicate: NSPredicate(value: true))
database.perform(query, inZoneWith: nil) { records, error in
if let records = records {
print("Records retrieved: \(records)")
} else if let error = error {
print("Error querying records: \(error)")
}
}
SwiftData如何使用数据库?
在SwiftData中,在配置CloudKit框架后。
通过ModelConfiguration配置cloudKitDatabase。
import SwiftUI
import SwiftData
@main
struct pigletApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
.modelContainer(modelContainer)
}
// 通过计算属性创建 ModelContainer
private var modelContainer: ModelContainer {
do {
let config = ModelConfiguration(
cloudKitDatabase: .automatic
)
return try ModelContainer(for: PiggyBank.self, configurations: config)
} catch {
fatalError("Failed to create ModelContainer: \(error)")
}
}
}
配置完成后,更新SwiftData时,可以在CloudKit网页中,也可以看到传递的数据,但具体是否传递成功,可能需要进一步配置CloudKit。
注意事项
1、网络依赖
CloudKit 操作需要网络连接,离线时操作会延迟。
2、配额限制
免费配额有限:每个应用每月有一定的存储和请求限制,超出需支付费用。
3、仅支持 Apple 平台
目前仅适用于 Apple 设备,无法在 Android 或 Windows 平台上使用。
通过 CloudKit,开发者可以快速构建具有云同步功能的应用,特别适合 Apple 生态下的应用程序开发。
参考文章
1、SwiftData数据同步到iCloud:https://fangjunyu.com/2024/11/10/swiftdata%e6%95%b0%e6%8d%ae%e5%90%8c%e6%ad%a5%e5%88%b0icloud/
2、SwiftData管理数据模型的配置对象ModelConfiguration:https://fangjunyu.com/2024/11/06/swiftdata%e7%ae%a1%e7%90%86%e6%95%b0%e6%8d%ae%e6%a8%a1%e5%9e%8b%e7%9a%84%e9%85%8d%e7%bd%ae%e5%af%b9%e8%b1%a1modelconfiguration/