IceCream帮助您将Realm数据库与CloudKit同步。
它就像魔法一样工作!
功能
-
Realm数据库
- 离线优先
- 线程安全
- 响应式编程
- 针对移动应用优化
- 迁移时易于使用
-
苹果云Kit
- 自动认证
- 静默推送
- 免费(带限制:私有数据库消耗用户的iCloud配额)
-
增量更新
-
可访问性(支持长期操作)
-
强大的错误处理
-
自动同步
-
支持多个对象模型
-
支持公有/私有数据库
-
大数据同步
-
支持手动同步
-
关系(一对一/一对多)支持
-
在所有Apple平台上可用(iOS/macOS/tvOS/watchOS)
-
支持自然类型列表的Realm
-
完整的文档
先决条件
- 确保已加入苹果开发者计划
- 在设置中打开iCloud,并在能力中选择
CloudKit
- 打开后台模式并检查
后台获取
和远程通知
使用说明
基础知识
- 准备你的王国对象(例如:狗、猫...)
class Dog: Object {
@objc dynamic var id = NSUUID().uuidString
@objc dynamic var name = ""
@objc dynamic var age = 0
@objc dynamic var isDeleted = false
static let AVATAR_KEY = "avatar"
@objc dynamic var avatar: CreamAsset?
@objc dynamic var owner: Person? // to-one relationships must be optional
override class func primaryKey() -> String? {
return "id"
}
}
- 做一些这样的事情
extension Dog: CKRecordConvertible & CKRecordRecoverable {
// Leave it blank is all
}
很简单吗?协议扩展就完成了这个技巧。
- 启动引擎!
var syncEngine: SyncEngine?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
...
syncEngine = SyncEngine(objects: [
SyncObject(type: Dog.self),
SyncObject(type: Cat.self),
SyncObject(type: Person.self)
])
application.registerForRemoteNotifications()
...
}
- 监听远程通知
AppDelegate中的示例代码将是一个很好的参考。
这就需要你做的全部事情!每当你向王国写入内容时,SyncEngine都会得到通知并处理同步事宜!
更多详情,请克隆项目查看源代码。
对象删除
是的,我们强烈建议你使用软删除。这就是为什么我们在CKRecordConvertible
协议中添加了一个isDeleted
属性的原因。
当你想要删除一个对象时,只需要将其isDeleted
属性设置为true,其他一切都已处理。
你也不必担心清理问题。这已经考虑到了。
同步资产怎么办?
幸运的是,我们有一个完美的解决方案来同步资产。当然,你也可以将你的图片或其他资源存储为Data
类型,一切照常工作。但Realm对数据属性有16MB的限制,而CloudKit鼓励我们在要分配给字段的数据超过几个千字节时使用CKAsset
。因此,考虑到上述两点,我们建议您使用CreamAsset
属性来保存数据。CreamAsset
会在文件系统中存储本地数据,并且在王国中只保存文件路径,这都是自动完成的。然后我们会将所有东西包装起来上传为CKAsset
。
提供了一个示例项目,你可以查看详细用法。
关系
自2.0版本起,IceCream正式支持Realm关系(一对一和一对多)。
特别是,对于一对多的关系支持,你必须将列表的元素类型传递给SyncObject初始化方法参数。例如:
syncEngine = SyncEngine(objects: [
SyncObject(type: Dog.self),
SyncObject(type: Cat.self),
SyncObject(type: Person.self, uListElementType: Cat.self) // if Person model has a List<Cat> property
])
需求
- iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
- Swift 5
调试建议
诚然,调试CloudKit是艰难且繁琐的。但是,在面临难题时,我有一些小窍门可以供你们参考。
- 你应该了解Realm和CloudKit的工作原理。
- 使用GUI工具,例如Realm Browser和CloudKit控制台。
- 当你迷路且不记得自己身处何处时,我建议从头开始。在CloudKit控制台中,有“重置...”按钮可供使用。你还可以通过重新安装应用程序来清除本地数据库。
- 默认情况下,IceCream只在DEBUG模式下向你的控制台打印一些日志。然而,如果你觉得这很麻烦,可以通过添加
IceCream.shared.enableLogging = false
来关闭它。 - 保持冷静,继续前进!
警告:如果你打算将应用程序发布到App Store,别忘了将环境设置部署到生产环境中。你可以在CloudKit控制台中轻松完成此操作。还需要考虑读写权限。
另一个小技巧
如何在生产模式下调试CloudKit?参见这篇文章post。
示例
要运行示例项目,请克隆存储库,然后打开Example/IceCream_Example.xcodeproj
。
安装指南
使用 Swift Package Manager,Carthage 或 CocoaPods。
Swift Package Manager
从 Xcode 11 开始,您可以使用 Swift Package Manager 将 IceCream 及其依赖项添加到项目中。
选择文件 > Swift 包 > 添加包依赖。在“选择包仓库”对话框中输入 https://github.com/caiyue1993/IceCream.git。在下一页中,指定版本解析规则为“至下一个主版本”,最早版本为“2.0.2”。在 Xcode 检出源并解决版本后,您可以选择“IceCream”库并将其添加到您的应用目标中。
如果您在将包添加到 Xcode 项目时遇到任何问题或有疑问,建议您阅读 Apple 的将包依赖项添加到您的应用指南文章。
Carthage
Carthage 是 Cocoa 应用的分布式依赖项管理器。
要使用 Carthage 将 IceCream 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它
github "caiyue1993/IceCream"
然后,运行以下命令以构建框架
carthage update
通常,您会得到 IceCream、Realm 和 RealmSwift 框架。您需要手动设置您的 Xcode 项目以添加这 3 个框架。
在您的应用目标的 常规 设置选项卡中,在 链接的框架和库 部分,从磁盘上的 Carthage/Build
文件夹拖放要使用的每个框架。
在您的应用目标的 构建阶段 设置选项卡上,点击“+”图标并选择“新运行脚本阶段”。创建一个包含以下内容的运行脚本
/usr/local/bin/carthage copy-frameworks
并将您想使用的框架路径添加到“输入文件”(以 iOS 平台为例)
$(SRCROOT)/Carthage/Build/iOS/IceCream.framework
$(SRCROOT)/Carthage/Build/iOS/Realm.framework
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework
有关如何使用 Carthage 的更多信息,请参阅其 项目页面。
CocoaPods
可以通過CocoaPods安裝IceCream。要安裝它,只需將以下行添加到您的Podfile中:
pod 'IceCream'
如果您想將IceCream作為靜態框架建構,則需要CocoaPods 1.4.0+。
讓它更好
這是IceCream專案的待辦事項清單。您可以加入我們成為貢獻者。
- CloudKit共享數據庫
參考CONTRIBUTING文件以了解貢獻指南。
動態演示
我的應用程序Sprint(一個輕量級的任務管理應用程序)正在使用IceCream。您可以下載它,並在您的多台設備上嘗試它,以看到這個魔法。

參考
貢獻者
該專案的存在要感謝所有貢獻者。
贊助
開源很棒,但維護它需要時間和精力。如果您能從經濟上支持IceCream的維護,那將非常感激,並將鼓勵我。您可以通过以下方式贊助此項目:
- 成為我的GitHub Sponsors,推薦
- 在Open Collective上支持我
- 直接通过PayPal轉捐您的捐贈
並感謝我們在Open Collective上的所有贊助者
许可协议
IceCream遵循MIT许可协议。有关更多信息,请参阅LICENSE文件。