问题标签 [nspersistentcloudkitcontainer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
107 浏览

swift - 镜像共享数据 CoreData + CloudKit

我已经使用 NSPersistentCloudKitContainer 设置了核心数据镜像,并且效果很好。我还管理了如何为记录创建共享。但是我怎样才能让共享记录与非所有者的核心数据同步呢?

示例:用户 A(所有者)与用户 B 共享记录,该记录(具有一对多关系)如何与用户 B Core Data 同步?

0 投票
2 回答
669 浏览

ios - Core Data+CloudKit 未连接到 CloudKit

我正在更新 iOS13 之前的 Core Data 应用程序以使用 Core Data+CloudKit 同步来支持多个设备上的单个用户。同步应该是自动发生的,并且在我开发的中间步骤中它确实有效。现在它不工作了,CloudKit 遥测没有注册任何活动,我不知道为什么它不工作。

在我以前的应用程序版本中,我在 UserDefaults 中提供了少量标签字符串并允许用户修改它们,更新的版本放回 UserDefaults。这是避免必须为少数对象管理第二个核心数据实体的捷径。

我已经意识到这在多设备实现中不起作用,因为本地 Core Data 数据库为空的事实不再意味着它是该用户的第一次使用。相反,每台新设备都需要查看基于云的数据源以查找用户正在使用的标签字符串,并且只有在用户还没有其他内容时才使用应用程序提供的默认值。

我按照 Apple 的使用 CloudKit 设置核心数据的说明进行操作,起初同步效果很好。但后来我意识到同步行为不正确,而不是从存储在 UserDefaults 中的字符串预填充,我真的需要提供一个预填充的核心数据数据库(.sqlite 文件)。我实现了这一点,并且在首次本地启动时复制捆绑的 .sqlite 文件后,该应用程序现在在本地运行良好。

但由于某种原因,此更改导致 CloudKit 同步停止工作。现在,我不仅没有在其他设备上获得任何自动更新,而且在 CloudKit 仪表板遥测中也没有得到任何结果,因此 CloudKit 同步似乎从未开始。这很奇怪,因为我在本地收到刚刚在本地发生的“远程”更改的通知(当我在本地保存新数据时,我列为通知的#selector 的函数在本地被调用)。

我对问题/解决方案感到困惑。这是我的相关代码。

注意:我已将目标更新为 iOS13+。

0 投票
0 回答
46 浏览

swift - 共享数据库中没有使用 NSPersistentCloudKitContainer 的父记录的子记录

我已经使用 NSPersistentCloudKitContainer 设置了一个到 CloudKit 的核心数据镜像。我的简化数据结构由 List 和 Item 组成。List 具有与多个 Items 的一对多关系,Item 具有parentList属性。

当我获得与 List NSManagedObject 关联的 CKRecord 并共享它时,我希望所有子项也可以共享。我知道,我可以为与 List 关联的每个 CKRecord 设置 parentRecord 属性

但我相信有一些聪明的方法可以避免手动执行此操作,因为一切都是自动镜像的,并且开始手动处理每个属性以仅设置 parentRecord 看起来很愚蠢。

有没有办法为 NSManagedObjects 做到这一点?因为我的自定义关系对于 CloudKit 并不意味着 List 是 Item 的父级。

0 投票
2 回答
160 浏览

ios - CoreData + CloudKit 但不共享

CoreData 非常棒。它使使用 SQLite DB 编码持久存储变得非常可预测。

CloudKit 非常棒。它使在 iCloud 中编写持久存储变得容易,并且可以在用户的​​设备之间共享。

CoreData + CloudKit 非常棒,因为它带来了本地数据存储和设备之间共享的优势。

现在, Apple 在使用 CoreData + CloudKit 时不支持用户之间的 CloudKit 共享这一事实让我感到完全愚蠢和惊讶。 每次我提出这个问题,人们都会看着我,为什么有人要这个?我很困惑。有没有理由不想利用本地+云同步的可共享存储组合?

如果有人可以帮助我理解为什么这不存在或者为什么我不想设计将本地持久性与云同步以及在用户之间共享这些对象的能力相结合的存储,那将是非常有用的?

0 投票
1 回答
265 浏览

ios - CloudKit NSPersistentCloudKitContainer 推送通知不起作用

我正在努力解决以下问题。尽管进行了深入的搜索,但我还没有成功。

我的开发环境是 macOS Big Sur Beta 下的 Xcode 12.0 beta (但是,问题在 Catalina 下的 Xcode 11.5 上似乎相同)。我正在开发的应用程序是多平台的,包括 macOS 10.16 和 iOS 13.5 目标。该应用程序使用 NSPersistentCloudKitContainer 为 CoreData 配置。

虽然registerForRemoteNotifications()在 iOS 目标中成功并没有任何问题,并且didRegisterForRemoteNotificationsWithDeviceToken被正确调用,但在 macOS 目标中没有任何反应:既没有didRegisterForRemoteNotificationsWithDeviceToken也没有didFailToRegisterForRemoteNotificationsWithError被触发。显然,在 macOS 和 iOS 目标上都正确配置了 CloudKit 和 PushNotification 权利。也在 macOS 上查询isRegisteredForRemoteNotifications返回...true

macOS 和 iOS 上的 persistentContainer 定义代码相同(NB 完全默认,并且automaticallyMergesChangesFromParent已正确设置)

最终结果是,虽然 CoreData 与推送通知的同步在 macOS -> iOS 方向上得到了正确处理,但在相反方向上没有任何反应(因为 macOS 上的推送通知没有被触发):从 iOS 到 macOS,CoreData 在 app 处重新对齐仅引导。

任何人都可以请自己朝着正确的方向前进吗?我从两天开始就用头撞墙,没有任何明智的结果......

PS 在运行 macOS 目标时还有另一个“症状”:任何时候在应用程序中触发 API 调用,尽管调用成功,Xcode 调试控制台中仍会出现以下消息:

iOS 目标不会发生这种情况。我无法为此找到一个体面的解释。我真的不知道这是否与推送通知问题有关。在公共领域搜索它并不快乐。

0 投票
1 回答
132 浏览

core-data - 如何在 NSPersistentCloudKitContainer 同步之前向 CKRecord 添加父级?

NSPersistentCloudKitContainer 自动为 NSManagedObjects 创建所有 CKRecords,所以...

如何在同步更改之前访问此进程并设置 CKRecord.parent。

我需要 B 类型的每个 CKRecord 都具有 A 类型的父记录,但要避免将 setParent(:) 完全手动处理为完全独立的机制。

0 投票
1 回答
761 浏览

swift - NSPersistentCloudKitContainer:与 App Extension 共享单个数据库

我知道这是一个常见的问题,也许以前被问过很多次。我还知道如何通过启用 App Groups 来使用 Core Data 与 App Extensions 共享单个数据库。我现在使用NSPersistentCloudKitContainer来同步数据(跨 iCloud 设备),效果很好。

但是我想与我的 App Extensions(Today Extension)共享我的数据库,此时 App Groups 将不再有帮助,因为它们是 Apple 描述的不同技术。所以我只是从签名和功能窗格中为容器应用程序和应用程序扩展启用了 iCloud。然后我可以从两个应用容器/扩展访问我的单个数据库,如下所示:

但是,它仅在设备在线时才有效(这是预期的行为),所以我的问题是:

当设备离线使用时,是否可以在应用程序和扩展程序之间共享我的数据库NSPersistentCloudKitContainer?一些解决方法?

编辑

这是一个非工作版本,我可以访问相同的数据库但没有云同步(没有出现在 CloudKit 仪表板上):

0 投票
0 回答
99 浏览

swift - NSPersistentCloudKitContainer 完成同步时如何获得通知?

NSPersistentCloudKitContainer 完成同步时如何获得通知?

我对上传Core Data 更改完成感兴趣,因为如果从服务器下载更改,Core Data 可以轻松通知。

0 投票
0 回答
511 浏览

objective-c - Core Data + CloudKit 迁移:无法在生产模式中的记录 [...] 中创建或修改字段 [...]

我使用 NSPersistentCloudKitContainer 将核心数据与 Cloud Kit 同步。为了准备新的迁移,我创建了 xcdatamodel 的新模型版本并将其标记为“当前”。我创建了一个新实体并添加了来自另一个实体的关系。我认为没有什么特别适合轻量级迁移的。

让我们命名这个新实体:EntityNew

这是我初始化 NSPersistentCloudKitContainer 的代码:

shouldMigrateStoreAutomaticallyshouldInferMappingModelAutomatically默认设置为 true。

在当地一切正常。迁移过程中未发生错误。

当我创建EntityNew的新实例时,问题就开始了:

newItem在本地创建没有任何问题,但 iCloud 同步从此刻停止工作。控制台中出现以下错误:

"<CKRecordID: 0x283fb1460; recordName=2E2209A1-F9F6-4DF2-960D-2C31F764ED05, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__>" = "<CKError 0x2830a5950: \"Batch Request Failed\" (22/2024); server message = \"Atomic failure\"; uuid = ADA626F4-160E-49FE-A0BD-2198E5FBD09A; container ID = \"iCloud.[MyContainerID]\">"

"<CKRecordID: 0x283fb1a00; recordName=3145C837-D80D-47E0-B944-DBC6576A9B0A, zoneID=com.apple.coredata.cloudkit.zone:__defaultOwner__>" = "<CKError 0x2830a4000: \"Invalid Arguments\" (12/2006); server message = \"Cannot create or modify field 'CD_[Fieldname in EntityNew]' in record 'CD_[OtherEntityName]' in production schema\"; uuid = ADA626F4-160E-49FE-A0BD-2198E5FBD09A; container ID = \"iCloud.[ContainerID]\">";

“无法在生产模式中的记录 'CD_[OtherEntityName]' 中创建或修改字段 'CD_[Fieldname in EntityNew]'”

Cloud Kit 尝试修改记录 CD_[OtherEntityName] 上的字段 CD_[Fieldname in EntityNew](正确),这不是我上面创建的实体!所以 Core Data 试图修改错误的实体!并非所有字段都发生此行为(大约 10 个字段中的 5 个)。我检查了 iPhone 的本地 sqlite 文件,但本地表似乎是正确的。在开发和生产 icloud-container-environment 中都可以观察到这种现象。如果我从一个空数据库开始(它已经包含新实体,因此不需要迁移),则同步工作。

我错过了什么?有任何想法吗?谢谢!

0 投票
0 回答
152 浏览

core-data - 从 CloudKit + CoreData 触发的多个重复 NSPersistentStoreRemoteChange 通知

我看到.NSPersistentStoreRemoteChange多次收到通知,有时多达 10 次。

我不认为这是有害的,但最好的情况是它会耗尽处理能力。

所以我的问题是:

  • 这有害吗?
  • 我可以阻止它吗?
  • 如果没有,是否有推荐的方法来忽略重复通知?

--

我有以下代码来设置我的容器。这包含在单例的初始化程序中,我已经确认它被调用过一次。

处理这些更改的代码: