问题标签 [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 回答
114 浏览

swift - watchOS/CloudKit 和后台同步

我正在开发一个使用 CloudKit 在 iOS、macOS 和 watchOS (Xcode) 上运行的 Swift 应用程序(请参阅下面的 CloudKit-Persistency-Container 初始化代码)。该应用程序运行良好:数据通过 iCould 在所有设备上同步。

我的问题:watchOS 上的同步/镜像非常慢……而且 watchOS 必须打开。有没有办法在后台(自动)处理 watchOS 上的同步/镜像?对于 iOS,我在应用程序目标定义中添加了“后台获取”和“后台处理”……watchOS 不存在 :(

谢谢和最好的问候,拉斯。

0 投票
1 回答
70 浏览

swift - 使用 NSPersistentCloudKitContainer 时处理 CKErrors

我有一个使用 Core Data 的应用程序,效果很好。我决定尝试使用 iCloud 在多个设备之间同步数据。我遵循将 NSPersistentContainer 更改为 NSPersistenCloudKitContainer 并添加 iCloud 功能、启用 CloudKit 和后台模式(远程通知)的基本步骤。通过这些很少的更改,数据在设备之间进行了应有的同步。看起来很简单。

但是,如果用户的 iCloud 存储空间已满,该应用程序将继续运行并在本地保存,但同步停止(显然)而不通知用户。

我知道这是一个 quotaExceeded 错误,但我将如何访问该错误然后处理它(以及一般处理 CKErrors)?

我觉得这个 NSPersistentCloudKitContainer 是一堵墙,我无法通过它来处理 CKErrors。我是初学者,所以也许我遗漏了一些明显的东西,但在网上找不到任何答案。

坚持 quotaExceeded 错误情况:

  • 第 1 步 - 发生 CKError.Code.quotaExceeded。
  • 第2步 - ???
  • 第 3 步 - 通知用户他们的 iCloud 存储空间已满。

第 2 步是什么样的?

0 投票
0 回答
830 浏览

cloudkit - NSPersistentCloudkitContainer 内存泄漏 -> 崩溃?(iOS 15 测试版 4、5、6 和 7...)

这是我在 Apple 论坛上创建的主题的副本

背景

我在 App Store 中有一个已建立的应用程序,该应用程序NSPersistentCloudKitContainer自 iOS 13 以来一直在使用,没有任何问题。我一直在运行 iOS 15 测试版的 iOS 设备上正常运行我的应用程序,主要是为了在我的用户看到问题之前发现问题。自iOS 15 beta 4以来,我的应用程序无法同步更改 - 无论更改多么小。上传“开始”但从未完成。大约一分钟后,应用程序退出到主屏幕,并且无法从崩溃报告中收集到任何有用的信息。直到现在我都不知道发生了什么。

API 中可能存在的错误?

在 iOS 15(beta 5)上使用 Xcode 13(beta 5)构建我的应用程序时,我设法在模拟器和另一台设备上复制了这种行为。似乎NSPersistentCloudKitContainer存在内存泄漏并不断增加 RAM 消耗(以及 100% 的 CPU),直到操作系统终止应用程序。我的代码没有运行。我并不是这些方面的专家,我尝试使用 Instruments 来看看这是否能告诉我任何东西。它似乎与以NSCloudkitMirroringDelegate某种方式“卡住”有关,但我不知道如何处理这些信息。我的核心数据数据库并不小,但无论如何也不庞大,而且NSPersistentCloudKitContainer在 iOS 15(beta 4)之前同步到 iCloud 没有问题。如果我恢复我的应用程序数据(从外部备份文件 - 700MB 有很多多对多、多对一关系、ckAssets 等),所有数据都会毫无问题地添加到核心数据中。控制台日志(见下文)然后显示同步已创建、计划和然后开始......但没有上传任何数据。此时内存消耗开始,我看到的只是出现“backgroundTask”警告(仅与 CloudKit 相关),没有运行我的代码。

只是想知道是否其他人也有类似的问题?在 iOS 15(beta 4)之前同步初始数据库恢复从来没有问题,并且在安装 iOS 15(beta 4)之后问题就开始了。我已将此提交给 Apple 反馈并正在等待回复 (FB9412346)。如果这是无法解决的,我真的有麻烦了(我的用户会很生气)。提前致谢!

编辑:它似乎已从 iOS 15.2(beta 2)解决,但 Apple 的官方说法是“未解决”。我怀疑这是因为它仍在测试中,当 15.2 公开时它很可能被标记为已解决

0 投票
1 回答
218 浏览

ios - Core Data + CloudKit 同步非常不一致

我有一个使用 Core Data + CloudKit 的应用程序,使用内置的 NSPersistentCloudKitContainer 同步。

它在大多数情况下运行良好,但有时它根本不会同步,没有错误或任何东西。

一些用户报告说它在 iPad 到 iPhone 上完美运行,但在 iPhone 到 iPad 上却不行。一些用户甚至报告随机丢失数据。我已经彻底检查了错误,但我真的无法弄清楚。有没有人有这个问题?有什么解决方案或至少有什么可以尝试的吗?这是数据容器代码:

0 投票
1 回答
117 浏览

swiftui - 自 Xcode 13 / iOS15 以来,获取“公共数据库中不允许自定义区域”

第一次在这里发帖,急需帮助。

我在开发使用 CloudKit Public DB 的应用程序时遇到了问题。我对此比较陌生,我可能做错了什么。我已经提炼了这个问题,只使用当您使用 iCloud 应用程序创建新的 Core Data 时出现的模板应用程序,并详细说明了以下步骤。可能是我在做一些愚蠢的事情。

这在 iOS 14 中有效,一旦 iOS 15 和 XCode 13 出现,它就停止了。我正在使用 SwiftUI。

简而言之,同步到公共数据库仅适用于应用程序的首次运行。停止和重新启动应用程序似乎会引发错误并导致镜像委托失败。

感谢所有帮助/建议。以下步骤重新创建问题:

  1. 使用 ICloud 中的核心数据和主机创建应用程序 - 界面是 SWiftUI

  2. 在项目签名和功能中添加 iCloud 和后台模式

  3. 在新出现的 iCloud 部分启用 Cloudkit 并选择或创建一个容器

  4. 在新出现的背景模式部分启用远程通知

  5. 在 persistence.swift 添加:

导入 CloudKit

  1. 仍然在 persistence.swift 添加以下内容:

我在以下行之前添加了这个:

  1. 在模式模型中,突出显示默认配置并在数据模型检查器中检查“使用 cloudkit”是否被选中

  2. 运行应用程序并点击 + 几次以添加一些记录。

  3. 检查在步骤 3 中选择/创建的容器中的公共数据库中的 Cloudkit Dashboard。您需要在 __recordID 和 __modTime 上创建索引才能查看记录。

您应该会看到大约一分钟后的记录都出现在公共数据库中。Xcode 的控制台窗口中不会报告任何错误。

  1. 停止并重新启动应用程序。

  2. 这次单击加号按钮时,记录不会上传到公共数据库,控制台会报告类似于以下的错误消息:

CoreData:CloudKit:CoreData + CloudKit:-NSCloudKitMirroringDelegate _finishedRequest:withResult::完成请求:<NSCloudKitMirroringExportRequest:0x283666bb0> 9F190C45-7713-4ACE-96DB-867D99FF62ED 结果:<NSCloudKitMirroringResult:0x2838b9e20>成功:0 madeChanges:0错误:错误域=NSCocoaErrorDomain Code=134406 "请求 '9F190C45-7713-4ACE-96DB-867D99FF62ED' 被中止,因为镜像委托由于错误而从未成功初始化:<CKError 0x2836aba50: "部分失败" (2/1011); "修改一些失败记录区域”;uuid = 3F399390-1F10-4198-BBBF-F3BD76E99591;容器 ID =“iCloud.askeit.com.WTBA”;部分错误:{ com.apple.coredata.cloudkit.zone: defaultOwner= <CKError 0x2836a5290:“服务器拒绝请求”(15/2027);server message = "公共数据库中不允许自定义区域"; 操作 = 943153DA6AC169A1;uuid = XXXXXXXXXXXXXXXXXXXXXXXX> }>" UserInfo={NSLocalizedFailureReason=Request '9F190C45-7713-4ACE-96DB-867D99FF62ED' 被中止,因为镜像委托由于错误而从未成功初始化:<CKError 0x2836aba50: "Partial Failure" (2/1011) ; "修改部分记录区失败"; uuid = 3F399390-1F10-4198-BBBF-F3BD76E99591; 容器ID = "iCloud.askeit.com.WTBA"; 部分错误: { com.apple.coredata.cloudkit.zone: defaultOwner = <CKError 0x2836a5290:“服务器拒绝请求”(15/2027);服务器消息=“公共数据库中不允许自定义区域”;操作 = 943153DA6AC169A1;uuid = XXXXXXXXXXXXXXXXXXXXXXXXX> }>}

所以基本上:

a)我是在做一些愚蠢的事情还是 b)代码在其他地方工作 - 所以必须是我的设置或 c)这是意外行为,我将不得不等待 Apple 对其进行排序。

预先感谢您提供的所有帮助。

干杯,

伊恩

0 投票
2 回答
185 浏览

swift - 将现有应用程序从 NSPersistentContainer 迁移到 NSPersistentCloudKitContainer

我有一个仅使用本地设备 CoreData (NSPersistentContainer) 的应用程序。我正在寻求迁移,因此该应用程序与 NSPersistentCloudKitContainer 兼容。我了解 NSPersistentCloudKitContainer 的所有 CloudKit 设置,但是如何将玩家手机上的数据迁移到 iCloud?(即如何将现有核心数据从 NSPersistentContainer 迁移到 NSPersistentCloudKitContainer)?

0 投票
0 回答
40 浏览

swift - 将 cloudkit 与 coredata 一起使用时,模拟器和真实设备永远不会相互同步

我使用核心数据作为本地存储,使用 Cloudkit 作为后端来托管我的 iOS 应用程序。我使用 NSPersistentCloudKitContainer 与 Coredata + Cloudkit 一起工作。

这就是代码的样子

在保存数据之前,我确保模拟器有一个 icloud 帐户。到目前为止,我已经测试过数据已与具有相同帐户的多个模拟器成功同步。

但是当我用真实设备测试模拟器时,反之亦然。它不会相互同步,就好像两者都被视为不同的设备一样。(两者拥有相同的帐户)

我确保一切都已相应设置:

  • 两种设备具有相同的构建
  • 后台远程通知已打开
  • 模拟器和真机具有相同的 icloud 帐户
  • coredata 中的所有属性都是可选的,除了 1-2 字段是必需的,所以不确定同步问题是否是由于架构相关问题引起的?(我的意思是我已经在 xcode 中更新了几次架构)
  • 模拟器完美同步
  • 我已经阅读了一些 stackoverflow,但找不到特定于我的用例的问题。

任何帮助表示赞赏


更新:比较是通过模拟器上的应用程序和从 testflight 下载的应用程序进行的。两者都有相同的 icloud 帐户。

0 投票
0 回答
31 浏览

core-data - CloudKit:使用 NSPersistentCloudKitContainer 时如何处理 CKError partialFailure?

我将 NSPersistentCloudKitContainer 与 Core Data 一起使用,但由于我的 iCloud 空间已满而收到错误消息。打印的错误如下:<CKError 0x280df8e40: "Quota Exceeded" (25/2035); server message = "Quota exceeded"; op = 61846C533467A5DF; uuid = 6A144513-033F-42C2-9E27-693548EF2150; Retry after 342.0 seconds>

我想通知用户这个问题,但我找不到访问错误详细信息的方法。我正在听NSPersistentCloudKitContainer.eventChangedNotification,我收到一个 .partialFailure 类型的错误。但是当我想访问底层错误时,错误的partialErrorsByItemID属性为零。

如何访问此配额超出错误?

0 投票
0 回答
77 浏览

swift - 如何使用 CoreData 和 CloudKit 处理重复数据删除?

我找不到任何关于CloudKit+CoreData的更新教程SwiftUICloudKit不支持约束那么我如何合并我的案例的重复记录?

我现在需要知道该怎么做,因为我必须禁用CoreData约束和我已有的合并策略。我一直在关注本教程。https://www.youtube.com/watch?v=0QGt0THnlwU

这是一个简单的代码,用于获取表单并将待办事项保存到 viewContext 并将关系设置为他们选择的类别。这现在创建了我不想要的重复类别。

0 投票
0 回答
70 浏览

swift - 使用 NSPersistentCloudKitContainer 时擦除核心数据数据库

我目前有一个将 Core Data 与 Apple 一起使用的应用程序,NSPersistentCloudKitContainer我有 2 个用户提到他们在更新应用程序时丢失了数据 - 我正在使用轻量级迁移,他们唯一的共同点是:两者都没有 iCloud 存储离开了

经过进一步检查,我注意到如果我转到设置 > iCloud > 为我的应用禁用它,每当我再次打开我的应用时,我的所有数据都会消失。

有人遇到这个问题吗?这是预期的吗?有什么办法吗?

作为参考,这是我的设置代码: