首页 > 解决方案 > Cloudkit + CoreData 并在早期 iOS 版本中上传到 iCloud

问题描述

TLDR

如何在 iOS 13 之前的 iOS 版本中将 cloudkit 与核心数据一起使用?


我正在构建一个可以在 iOS 12+ 上运行的应用程序。
我使用核心数据,我也希望能够在 iCloud 中上传数据。我在可用时设置了持久化容器NSPersistentCloudKitContainer,但我仍然有一些疑问。我目前管理这样的存储:

 //MARK: PersistentContainer
    lazy var persistentContainer: NSPersistentContainer = {
        let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: CoreHelp.appGroup)!
        let storeURL = containerURL.appendingPathComponent(CoreHelp.sql)
        let description = NSPersistentStoreDescription(url: storeURL)
        
        if #available(iOS 13.0, *) { //ios 13+
            let container = NSPersistentCloudKitContainer(name: CoreHelp.appName)
            container.loadPersistentStores(completionHandler: {
                (storeDescription, error) in
                if let error = error as NSError? {
                    fatalError("Unresolved error \(error), \(error.userInfo)")
                }
            })
            description.setOption(true as NSObject, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
            container.viewContext.automaticallyMergesChangesFromParent = true
            container.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
            return container
        } else { //less than iOS 13
            let container = NSPersistentContainer(name: CoreHelp.appName)
            container.loadPersistentStores(completionHandler: { (storeDescription, error) in
                if let error = error as NSError? {
                    fatalError("Unresolved error \(error), \(error.userInfo)")
                }
            })
            container.viewContext.automaticallyMergesChangesFromParent = true
            container.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
            return container
        }
    }()

//Where CoreHelp. … is a struct containing different ids.

这有效(至少在 iOS 13+ 上),但我很难找出正确的设置方法。这些是我的主要担忧:

我阅读了更多内容:
Using Core Data, iCloud and CloudKit for syncing and backups and how it works together
CloudKit and Core sync data between devices

但现在情况发生了变化。

标签: iosswiftcore-dataicloudcloudkit

解决方案


答案 tl;dr 是你通过做很多独立的工作来做到这一点,我个人不能保证会成功。iOS 12 或更低版本不支持具有 Core Data 的 CloudKit。

最可能的场景是使用 CloudKit 的 JavaScript 接口,可能使用自定义服务器来托管 JS 代码。具体细节由您决定,但有一个Ray Wenderlich 教程可以帮助您入门。祝你好运。

如果这不起作用,那么对于您支持的所有 iOS 版本,您最好的选择可能是第三方Ensembles框架,而不是 Apple 内置的 CloudKit 支持。它可以与 iCloud 或其他同步服务一起使用。我已经将它与 CloudKit 一起使用,它很可靠。


推荐阅读