无法通过应用扩展程序访问我的`CKContainer`中的任何数据-CloudKit,Swift

问题描述

我想通过应用程序扩展(更具体地说是手表应用程序)从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

感谢您的帮助!

解决方法

我整整一天都在尝试解决问题,最终成功。我找到的是:云容器ID中的姓氏必须与产品目标ID和应用程序名称(plist文件中CFBundleName的值)匹配。默认情况下,这是在info.plist中设置的方式:

    Dim pathString As String = My.Settings.filePath
    Dim fullPath = Path.Combine(pathString,"Locatie.txt")
    If Not Directory.Exists(pathString) Then
        Directory.CreateDirectory(pathString)
        File.Create(fullPath)
    Else
        If Not File.Exists(pathString) Then
            File.Create(fullPath)
        Else
            Console.WriteLine($"File {fullPath}already exists.")
        End If
    End If

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

context('conditional test',() => {
    if (Cypress.env('myVariable')) {
        it('conditional test',function () {
            //code to be run only if the variable is true
        })
    }
}

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

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

enter image description here

,

苹果似乎已经将其固定在一边!

仍然感谢您的帮助:)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...