Core Data 与 Ensembles 的 iCloud 同步

Posted

技术标签:

【中文标题】Core Data 与 Ensembles 的 iCloud 同步【英文标题】:iCloud syncing of Core Data with Ensembles 【发布时间】:2017-10-25 07:33:56 【问题描述】:

我的计划是购买 Ensembles 2(以利用速度/效率等),但我试图确保我能够首先让它工作(在测试 Swift 项目中)。为此,我正在尝试使用 v1。

使用 Simple Sync with Swift 作为指南,我已将集成集成到我的 xcode 项目中。

应用程序中的数据似乎确实存储在 iCloud 中,因为当我删除应用程序然后重新添加它时,提取然后同步确实从 iCloud 恢复了正确的数据。我的麻烦是使用第二台设备(登录到同一个苹果/iCloud 帐户)进行测试对自己的数据做同样的事情。来自 2 个设备的数据永远不会合并。但是,在每个设备上创建的数据会在重新加载应用程序后恢复到自己的设备上。

有人知道这是怎么回事吗?

我想知道问题是否可能是我正在生成的商店网址。许多核心数据堆栈设置现在在 Swift 3+ (NSPersistentContainer) 中自动完成,因此这些东西不需要由用户生成。这是我在设置我的集成时如何生成商店 url 和模型 url 的变量:

var storeDirectoryURL: URL 
        return try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    

var storeURL: URL 

        return storeDirectoryURL.appendingPathComponent("VsSyncTest.sqlite")
    

    // Setup Ensemble

let modelURL = Bundle.main.url(forResource: "VsSyncTest", withExtension: "momd")

【问题讨论】:

【参考方案1】:

我能想象到的唯一方法是,如果您使用不同的 iCloud 帐户,或者您为每台设备使用不同的 ensemble 标识符。

另请注意,iCloud 文档共享可能很顽固。仅仅因为文件被本地添加到容器中并不意味着它们会立即传输到其他设备。 (CloudKit 后端在这方面要好得多,但仅限于 E2。)

如果您使用模拟器进行测试,使用Debug > iCloud > Trigger Sync in Simulator 可能会有所帮助。

【讨论】:

谢谢德鲁。 iCloud 帐户肯定是相同的(每个帐户都已注销并再次登录)。与集成标识符一样(已从两个设备中删除并从 xcode 重新加载)。在模拟器上强制同步也没有帮助。还有什么我可以做的吗?有没有办法查看 iCloud 上存储的内容,因为这可能会让您了解正在发生的事情? 我最好的猜测是您根本没有调用merge... 方法。除非您致电merge...,否则不会引入任何云数据。添加一个按钮或计时器来执行此操作(通知有效,但不可靠)。要检查容器内容,请转至~/Library/Mobile Documents/iCloud~<your app id>。在 Mac 上,只需在您的主文件夹中,在模拟器中,找到用户文件夹并从那里开始。 显式调用合并没有任何区别。我想知道我的 persistentStore: store url 是否错误,并且在两个设备上都使用了不同的 URL。那可能吗?最新版本的 Swift/xcode 在幕后做了很多核心数据堆栈的设置,所以不确定我是否提取了正确的 url。将使用代码编辑问题.... 目前使用模拟器测试通过 iCloud 同步一定存在一些问题。现在已经能够在 2 台物理设备上进行测试,并且同步按预期工作。

以上是关于Core Data 与 Ensembles 的 iCloud 同步的主要内容,如果未能解决你的问题,请参考以下文章

将 Ensembles 添加到现有 Coredata / iCloud 应用程序的步骤

核心数据与 Ensembles 同步:在本地模型更改之前,不会拉下远程更改

让 Ensembles Idiomatic OSX App 与 iCloud 同步

iOS swift 中的错误尝试使用 Ensembles

Swift Ensembles 设置和 ubiquityContainerIdentifier

在使用 Ensembles 进行 CoreData 和 iCloud 同步之前,我是不是需要任何 iCloud 设置?