无法从应用程序扩展访问我的“CKContainer”中的任何数据 - CloudKit,Swift

Posted

技术标签:

【中文标题】无法从应用程序扩展访问我的“CKContainer”中的任何数据 - CloudKit,Swift【英文标题】:Can't access any data from my `CKContainer` from a app extension - CloudKit, Swift 【发布时间】:2020-11-01 08:27:42 【问题描述】:

我想通过应用扩展(更具体地说是手表应用)从 CloudKit 访问一些数据。

在我的主应用程序中,我只需像这样创建我的容器:CKContainer(identifier: "myContainerID"),然后调用私有数据库上的任何方法

在我的应用扩展中,我使用完全相同的代码创建了一个容器,但是当我尝试调用私有数据库上的方法时,我收到了这个错误:

<CKError 0x600003953c90: "Permission Failure" (10/2007); server message = "Invalid bundle ID for container"; uuid = 76F8A8B0-0B53-4D23-A7EB-D9982C7CE0BB; container ID = "myContainerID">

我还仔细检查了我是否拥有所有正确的 iCloud 权利。

我也看到了这个问题,但我已经在使用解决方案:how to make watchkit extension app and my iphone app share the same icloud databases

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我今天花了一整天的时间试图修复,终于成功了。这是我发现的:云容器 ID 中的姓氏必须与产品目标 ID 和应用程序名称匹配(plist 文件中 CFBundleName 的值)。这是在 info.plist 中默认设置的方式:

<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string> 

其中 $(PRODUCT_NAME) 是我上面提到的目标。请参阅底部的图片。同样重要的是要注意,通过更改现有目标来修复不匹配是行不通的。您需要做的是创建一个新容器,其 ID 与姓氏匹配您的产品名称,例如如果您的产品名称是 abc,则新容器 ID 应如下所示:

iCloud.com.company.abc

更改后,您需要将新容器添加到您的 APP ID,并重新创建配置文件,因为它们将失效。创建新配置文件后,只需下载它们并导入 Xcode/Signing and Capabilities。

请注意,Apple 官方文档确实说建议使用应用名称,但他们从未说过这是强制性的,并且是使其正常工作的唯一方法。

【讨论】:

谢谢,这样的事情似乎仍然是必要的。看来,如果您添加一个与应用程序包标识符具有相同 id 的 CloudKit 容器,那么 Xcode 会为您设置好东西(包括启用的 iCloud 容器)。其他地方的各种信息表明您应该能够手动执行此操作,但这对我不起作用。【参考方案2】:

Apple 似乎已经将其解决了!

谢谢你的帮助:)

【讨论】:

以上是关于无法从应用程序扩展访问我的“CKContainer”中的任何数据 - CloudKit,Swift的主要内容,如果未能解决你的问题,请参考以下文章

无法从应用扩展访问本地化资源

CKContainer.discoverAllIdentities 总是失败

无法从派生类型列表访问扩展方法

从扩展更新 UIApplicationShortcutItem

CKContainer requestApplicationPermission 中的服务不可用错误(CKError Code 6)

无法访问我的扩展方法