IceCream

CI Status Version Carthage compatible License Platform

contributions welcome

IceCream 帮助你将 Realm 数据库与 CloudKit 同步。

它像魔法一样工作!

特性

前提条件

  1. 确保你已注册 Apple 开发者计划
  2. 在 Capabilities 中启用 iCloud 并选择 CloudKit
  3. 启用 Background Modes 并勾选 Background fetchRemote notification

使用方法

基础

  1. 准备好你的 Realm 对象(例如 Dog, Cat...)
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"
    }
}
  1. 像这样操作
extension Dog: CKRecordConvertible & CKRecordRecoverable {
    // Leave it blank is all
}

就这么简单? Protocol Extensions 实现了这个技巧。

  1. 启动引擎!
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()
    ...
}
  1. 监听远程通知

AppDelegate 中的示例代码会是一个很好的参考。

这就是你需要做的全部! 每次你写入 Realm, SyncEngine 都会收到通知并处理同步事务!

更多细节,请克隆项目查看源代码。

对象删除

是的,我们强烈建议你使用软删除。 这就是为什么我们向 CKRecordConvertible 协议添加 isDeleted 属性的原因。

当你想要删除一个对象时,你只需要将其 isDeleted 属性设置为 true,其余的事情都已经处理好了。

你也不需要担心清理工作。 这也已经被考虑到了。

如何同步 asset?

幸运的是,我们有一个完美的 asset 同步解决方案。 当然,你也可以将你的图像或资源之类的东西存储为 Data 类型,一切都运作良好。 但是 Realm 对数据属性有 16MB 的限制。 并且 CloudKit 鼓励我们在要分配给字段的数据大于几 KB 时使用 CKAsset。 因此,考虑到以上两点,我们建议你使用 CreamAsset 属性来保存数据。 CreamAsset 会将本地数据存储在文件系统上,并将文件路径保存在 Realm 中,一切都是自动的。 我们会将所有内容打包并上传到 CloudKit 作为 CKAsset

提供了一个示例项目来查看详细的用法。

关系

自 2.0 版本以来,IceCream 已经正式支持 Realm 关系(包括一对一和一对多)。

特别是对于支持一对多关系,你必须将 List 的元素类型传递给 SyncObject init 方法的参数。 例如

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
        ])

要求

调试建议

调试 CloudKit 确实很困难而且乏味。 但是当遇到难题时,我有一些技巧可以提供给你们。

警告:如果你要将你的应用发布到 App Store,请不要忘记将你的环境设置部署到生产环境。 你可以在 CloudKit Dashboard 中轻松地完成此操作。 还需要考虑读写权限。

再一个提示

如何在生产模式下调试 CloudKit? 请参阅此 帖子

示例

要运行示例项目,请克隆该 repo,然后打开 Example/IceCream_Example.xcodeproj

安装指南

使用 Swift Package Manager、Carthage 或 CocoaPods。

Swift Package Manager

从 Xcode 11 开始,你可以使用 Swift Package Manager 将 IceCream 及其依赖项添加到你的项目。

选择 File > Swift Packages > Add Package Dependency。 在 “Choose Package Repository” 对话框中输入 https://github.com/caiyue1993/IceCream.git。 在下一页中,将版本解析规则指定为 “Up to Next Major”,并将 “2.0.2” 作为其最早的版本。 在 Xcode 检出源代码并解析版本后,你可以选择 “IceCream” 库并将其添加到你的应用目标。

如果你在将软件包添加到 Xcode 项目时遇到任何问题或有疑问,我建议阅读 Apple 的 Adding Package Dependencies to Your App 指南文章。

Carthage

Carthage 是 Cocoa 应用程序的去中心化依赖管理器。

要使用 Carthage 将 IceCream 集成到你的 Xcode 项目中,请在你的 Cartfile 中指定它

github "caiyue1993/IceCream"

然后,运行以下命令来构建 frameworks

carthage update

通常,你将获得 IceCreamRealmRealmSwift frameworks。 你需要手动设置你的 Xcode 项目以添加这 3 个 frameworks。

在你的应用程序目标的 General 设置标签中,在 Linked Frameworks and Libraries 部分中,从磁盘上的 Carthage/Build 文件夹中拖放要使用的每个 framework。

在你的应用程序目标的 Build Phases 设置标签中,单击 “+” 图标并选择 “New Run Script Phase”。 创建一个包含以下内容的 Run Script

/usr/local/bin/carthage copy-frameworks

并在 “Input Files” 下添加要使用的 frameworks 的路径(以 iOS 平台为例)

$(SRCROOT)/Carthage/Build/iOS/IceCream.framework
$(SRCROOT)/Carthage/Build/iOS/Realm.framework
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework

有关如何使用 Carthage 的更多信息,请参阅其 项目页面

CocoaPods

IceCream 可通过 CocoaPods 获得。 要安装它,只需将以下行添加到你的 Podfile

pod 'IceCream'

如果你想将 IceCream 构建为静态 framework,则需要 CocoaPods 1.4.0+。

让它更好

这是 IceCream 项目的待办事项列表。 你可以加入我们成为贡献者。

有关贡献指南,请参阅 CONTRIBUTING 文件。

实时演示

我的应用 Music Mate(Apple Music 的缺失伴侣)正在充分利用 IceCream。 你可以下载它并在你的多个设备上尝试它,看看这个魔法。

参考

贡献者

这个项目之所以存在,要感谢所有贡献者

赞助

开源很棒,但需要时间和精力来维护。 如果你能以经济方式支持 IceCream 的维护,我将非常感激并受到激励。 你可以通过以下方式赞助该项目

并感谢我们在 open collective 上的所有支持者

许可

IceCream 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。