ios - 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+ 上),但我很难找出正确的设置方法。这些是我的主要担忧:
我是否必须检查/询问用户是否要启用云同步,还是根据他们的手机设置自动检查?
如果用户不想将数据同步到云端,我是否需要改用 NSPersistentContainer?
iOS 13 之前发布的版本不支持 NSPersistentCloudKitContainer。如何使用 CloudKit 同步/上传 iOS 12 用户保存的数据(可能仍在使用 CoreData)?
我阅读了更多内容:
Using Core Data, iCloud and CloudKit for syncing and backups and how it works together
CloudKit and Core sync data between devices
但现在情况发生了变化。
解决方案
答案 tl;dr 是你通过做很多独立的工作来做到这一点,我个人不能保证会成功。iOS 12 或更低版本不支持具有 Core Data 的 CloudKit。
最可能的场景是使用 CloudKit 的 JavaScript 接口,可能使用自定义服务器来托管 JS 代码。具体细节由您决定,但有一个Ray Wenderlich 教程可以帮助您入门。祝你好运。
如果这不起作用,那么对于您支持的所有 iOS 版本,您最好的选择可能是第三方Ensembles框架,而不是 Apple 内置的 CloudKit 支持。它可以与 iCloud 或其他同步服务一起使用。我已经将它与 CloudKit 一起使用,它很可靠。
推荐阅读
- vb.net - 在 vb.net 中的 CREATE TABLE 期间将 rtf 添加到 MS Access 字段
- hibernate - Hibernate JPA CriteriaQuery with count 和 where 谓词
- javascript - 如何在另一个异步函数中执行代码之前等待一个循环在异步函数中完成?
- javascript - HTTP 文件上传无法解析表单数据?
- cognos - 如何根据另一个特定列的值创建一列?
- c - 结构赋值的 2 个不同的奇怪错误
- awk - grep/awk/sed 有状态行匹配
- php - group by 后的 order by 语句在 cpanel 中不起作用,但在 localhost 中起作用
- swift - 如何在 iPad 版 Playgrounds 中添加图像?
- pandas - TypeError: unhashable type: 'list' 数据框列表映射