【发布时间】:2021-12-04 04:48:59
【问题描述】:
第一次在这里发帖,急需帮助。
我在开发使用 CloudKit Public DB 的应用程序时遇到了问题。我对此比较陌生,我可能做错了什么。我已经提炼了这个问题,只使用当您使用 iCloud 应用程序创建新的 Core Data 时出现的模板应用程序,并详细说明了以下步骤。可能是我在做傻事。
这在 iOS 14 中有效,但在 iOS 15 和 XCode 13 出现后,它就停止了。我正在使用 SwiftUI。
简而言之,同步到公共数据库仅适用于应用程序的首次运行。停止并重新启动应用程序似乎会引发错误并导致镜像委托失败。
感谢所有帮助/建议。以下步骤重新创建问题:
-
使用 ICloud 中的核心数据和主机创建应用程序 - 界面是 SWiftUI
-
在项目签名和功能中添加 iCloud 和后台模式
-
在新出现的 iCloud 部分启用 Cloudkit 并选择或创建一个容器
-
在新出现的背景模式部分启用远程通知
-
在 persistence.swift 添加:
导入 CloudKit
- 仍在 persistence.swift 中添加以下内容:
guard let description = container.persistentStoreDescriptions.first else
{
fatalError("Something bad happened")
}
description.cloudKitContainerOptions?.databaseScope = .public
我在以下行之前添加了这个:
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
-
在模式模型中,突出显示默认配置并在数据模型检查器中检查“使用 cloudkit”是否被选中
-
运行应用程序并点击 + 几次以添加一些记录。
-
在第 3 步中选择/创建的容器中的公共数据库中检查 Cloudkit Dashboard。您需要在 __recordID 和 __modTime 上创建索引才能查看记录。
您应该会看到大约一分钟后的记录都出现在公共数据库中。 Xcode 的控制台窗口没有报错。
-
停止并重新启动应用程序。
-
这次单击加号按钮时,记录不会上传到公共数据库,控制台会报告类似以下的错误消息:
CoreData: CloudKit: CoreData+CloudKit: -NSCloudKitMirroringDelegate _finishedRequest:withResult:: Finished request:
所以基本上:
a) 我是不是在做傻事 要么 b)代码在其他地方工作 - 所以必须是我的设置 要么 c) 这是出乎意料的行为,我将不得不等待 Apple 对其进行排序。
提前感谢您提供的所有帮助。
干杯,
伊恩
【问题讨论】:
-
什么是名为“容器”的家伙,它是如何设置的?
-
感谢您回到我身边。创建项目并为目标添加 iCloud 功能,出现 iCloud 面板。它有两个主要部分,服务 - 您可以在其中检查 CloudKit 和容器。如果你还没有容器,点击加号,你会得到一个弹出窗口。然后给它起一个像“com.acme.test1”之类的名字(让它对你自己有用,因为据我所知你不能删除它们)。当你保存它时,它会显示几秒钟,然后变成灰色。您需要登录您的 iCloud 帐户。单击 CloudKit 控制台按钮将在线显示它。
-
我用过 CloudKit 很多次。一个叫“容器”的人是从哪里来的?它是一个变量,只有你知道它在哪里设置。
-
这是我在 Persistence.swift 中创建项目时自动生成的,不是我添加的。我给我的项目起的名字是TestCK3。这就是代码的样子: let container: NSPersistentCloudKitContainer init(inMemory: Bool = false) { container = NSPersistentCloudKitContainer(name: "TestCK3") if inMemory { container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/开发/空") }
-
我对标记有一些疑问 - 请原谅。在模型本身中,我没有更改任何内容,只是使用了默认的 Item 实体。这显然不是我的应用程序代码,你可能会写一篇关于可以改进的东西的论文,但是这个简单的模板设置说明了我遇到的问题。
标签: swiftui cloudkit ios15 xcode13 nspersistentcloudkitcontainer