从 Xcode 13 / iOS15 开始获得 "Custom zones are not allowed in public DB"

Getting "Custom zones are not allowed in public DB" since Xcode 13 / iOS15

首先post这里,急需帮助。

我在开发使用 CloudKit Public 数据库的应用程序时遇到问题。我对此比较陌生,我可能做错了什么。我已经将问题提炼为仅使用当您使用 iCloud 应用程序创建新的核心数据时出现的模板应用程序,并详细说明了以下步骤。可能是我在做傻事

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

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

非常感谢收到所有帮助/建议。以下步骤重现了该问题:

  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 中选择/创建的容器中的 public 数据库中检查 Cloudkit 仪表板。您需要在 __recordID and__modTime为了查看记录。

您应该会看到大约一分钟后的记录都出现在 public 数据库中。在 Xcode.

的控制台 window 中没有报告任何错误
  1. 停止并重新启动应用程序。

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

CoreData: CloudKit: CoreData+CloudKit: -NSCloudKitMirroringDelegate _finishedRequest:withResult:: 完成请求: 9F190C45 -7713-4ACE-96DB-867D99FF62ED 结果: 成功:0 madeChanges:0 错误:错误域=NSCocoaErrorDomain 代码=134406“请求'9F190C45-7713-4ACE-96DB-867D99FF62ED'被中止,因为镜像委托由于错误而从未成功初始化:defaultOwner = }>" UserInfo={NSLocalizedFailureReason=Request '9F190C45-7713-4ACE-96DB-867D99FF62ED' 被中止,因为镜像委托由于错误而从未成功初始化:defaultOwner = }>}

所以基本上:

a) 我是不是在做傻事 要么 b) 代码在别处工作——所以一定是我的设置 要么 c) 这是意外行为吗,我得等苹果来解决它。

提前感谢您提供的所有帮助。

干杯,

伊恩

对于偶然发现此问题的人,该问题现在似乎已在 iOS 15.1 中得到解决。我先安装了 Xcode 13.1,这并没有解决问题,但是当我升级我的测试设备时,它起作用了。是 iOS 15.1 还是两者的结合,我不能肯定。

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