1

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

我在开发使用 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 添加以下内容:
guard let description = container.persistentStoreDescriptions.first else
{
fatalError("Something bad happened")
}

description.cloudKitContainerOptions?.databaseScope = .public

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

  container.loadPersistentStores(completionHandler: { (storeDescription, error) in
  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 对其进行排序。

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

干杯,

伊恩

4

1 回答 1

0

对于那些偶然发现这一点的人来说,这个问题现在似乎在 iOS 15.1 中得到了解决。我先安装了 Xcode 13.1,但这并没有解决问题,但是当我升级我的测试设备时,它可以工作了。无论是 iOS 15.1 还是两者的结合,我都不能肯定。

一个跟进。我仍然不相信这是 100% 正确的。我的代码再次正常工作,然后似乎恶化,然后完全停止工作。我已经能够让它再次运行。它似乎与 Cloudkit 架构相关联。仅模式的初始化似乎是不够的。我很确定它是以前的,因为我会进行初始化,然后手动创建索引以查看我的记录。为了让它再次工作,我必须预先创建索引,因为我收到错误消息说镜像委托由于错误“无效参数”(12/2015)而没有成功初始化;server message = "字段 'recordName' 未标记为可查询"; 所以 recordID 需要一个可查询的索引,而 modTime 需要可查询和可排序的。我还注意到 Cloudkit Dashboard 中似乎存在故障,如果同时为 modTime 添加两个索引,则其中一个不会出现。因此,请务必检查后。如果这继续困扰我一个多月,我将添加更新。如果有人发现我犯了新错误,请发表评论并告诉我。

于 2021-10-26T14:12:18.137 回答